Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c901e5d0d | |||
| 3bcbaae4c3 | |||
| 17e972d603 | |||
| 0e4b1af1ce |
@@ -49,8 +49,6 @@ export default function InviteRelative({action, situation, setReloadRelList}) {
|
|||||||
}); // STATE FOR KNOWING WHEN A REQUEST IS MADE TO THE SERVER
|
}); // STATE FOR KNOWING WHEN A REQUEST IS MADE TO THE SERVER
|
||||||
|
|
||||||
const handleInvite = (values) => {
|
const handleInvite = (values) => {
|
||||||
// delete values.firstname
|
|
||||||
// delete values.lasttname
|
|
||||||
setRequestStatus({loading: true, status: false, message: ""})
|
setRequestStatus({loading: true, status: false, message: ""})
|
||||||
api.inviteFamilyRelative(values).then(response => {
|
api.inviteFamilyRelative(values).then(response => {
|
||||||
let {status, data} = response
|
let {status, data} = response
|
||||||
|
|||||||
@@ -24,21 +24,22 @@ export default function RelativeTable({relativeList}) {
|
|||||||
{relativeList && relativeList?.length > 0 ? (
|
{relativeList && relativeList?.length > 0 ? (
|
||||||
currentRelativeList.map((value, index) => (
|
currentRelativeList.map((value, index) => (
|
||||||
<tr key={value.uid || index} className="border-b dark:border-[#5356fb29] hover:bg-gray-50">
|
<tr key={value.uid || index} className="border-b dark:border-[#5356fb29] hover:bg-gray-50">
|
||||||
<td className='py-2'>
|
<td className='p-2'>
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
|
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
|
||||||
{/* {value.firstname && value.firstname} {value.lastname && value.lastname} */} Firstname Lastname
|
{value.firstname && value.firstname} {value.lastname && value.lastname}
|
||||||
</h1>
|
</h1>
|
||||||
<span className="text-sm text-thin-light-gray">
|
<span className="text-sm text-thin-light-gray">
|
||||||
{/* {value.email && value.email} */} email.gmail.com
|
{value.email && value.email}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td className='py-2'>
|
<td className='p-2'>
|
||||||
family type
|
{/* <span>Family Type</span> */}
|
||||||
|
<span>{value.family_type && value.family_type.toUpperCase()}</span>
|
||||||
</td>
|
</td>
|
||||||
<td className='py-2 text-right'>
|
<td className='p-2 text-right'>
|
||||||
{0}
|
{value.status && value.status}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -21,8 +21,12 @@ const Relatives = () => {
|
|||||||
const getRelativeList = () => {
|
const getRelativeList = () => {
|
||||||
setRelativeList(prev => ({...prev, loading: true}))
|
setRelativeList(prev => ({...prev, loading: true}))
|
||||||
api.getFamilyRelativeList().then(response => {
|
api.getFamilyRelativeList().then(response => {
|
||||||
setRelativeList({loading:false, data:response.data.family_types})
|
let {data:{result_list}} = response
|
||||||
// console.log('RESPONSE',response.data)
|
if(!result_list || result_list?.length <= 0){
|
||||||
|
setRelativeList({loading:false, data:[]})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setRelativeList({loading:false, data:result_list})
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
setRelativeList({loading:false, data:[]})
|
setRelativeList({loading:false, data:[]})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export default function DeleteGroup({action, situation, details}) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="mb-6">
|
<div className="mb-6">
|
||||||
<p className="text-xl text-center tracking-wide text-dark-gray dark:text-white">
|
<p className="text-xl text-center tracking-wide text-dark-gray dark:text-white">
|
||||||
Are you sure, you want to delete <br /> <span>'{details?.group_name}'</span>
|
Are you sure, you want to delete <br /> <span>'{details?.group_name}'</span> group?
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex space-x-2.5">
|
<div className="flex space-x-2.5">
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export default function DeleteMember({action, situation, details}) {
|
|||||||
<div className="logout-modal-wrapper lg:w-[500px] h-full lg:h-auto bg-white dark:bg-dark-white lg:rounded-2xl">
|
<div className="logout-modal-wrapper lg:w-[500px] h-full lg:h-auto 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 Member
|
Remove Member
|
||||||
</h1>
|
</h1>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@@ -73,7 +73,7 @@ export default function DeleteMember({action, situation, details}) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="mb-6">
|
<div className="mb-6">
|
||||||
<p className="text-xl text-center tracking-wide text-dark-gray dark:text-white">
|
<p className="text-xl text-center tracking-wide text-dark-gray dark:text-white">
|
||||||
Are you sure, you want to delete <br /> <span>'{details?.firstname} {details.lastname}'</span>
|
Are you sure, you want to remove <br /> <span>'{details?.firstname} {details.lastname}'</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex space-x-2.5">
|
<div className="flex space-x-2.5">
|
||||||
@@ -92,7 +92,7 @@ export default function DeleteMember({action, situation, details}) {
|
|||||||
type="button"
|
type="button"
|
||||||
className="text-white primary-gradient text-18 tracking-wide px-4 py-3 rounded-full"
|
className="text-white primary-gradient text-18 tracking-wide px-4 py-3 rounded-full"
|
||||||
>
|
>
|
||||||
Confirm Delete
|
Remove
|
||||||
</button>
|
</button>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,72 +1,104 @@
|
|||||||
import React, { useState } from 'react'
|
import React, { useState } from "react";
|
||||||
|
|
||||||
import InputCom from '../../components/Helpers/Inputs/InputCom/index'
|
import AddGroup from "./AddGroup";
|
||||||
import DeleteGroup from './DeleteGroup'
|
import DeleteGroup from "./DeleteGroup";
|
||||||
import AddGroup from './AddGroup'
|
import { localImgLoad } from "../../lib";
|
||||||
|
|
||||||
export default function GroupList({groupList, selectedGroup, changeSelectedGroup, setUpdateList}) {
|
export default function GroupList({
|
||||||
|
groupList,
|
||||||
|
selectedGroup,
|
||||||
|
changeSelectedGroup,
|
||||||
|
setUpdateList,
|
||||||
|
}) {
|
||||||
|
const [deletePopout, setDeletePopout] = useState({
|
||||||
|
status: false,
|
||||||
|
data: {},
|
||||||
|
});
|
||||||
|
|
||||||
const [deletePopout, setDeletePopout] = useState({
|
const [addGroupPopout, setAddGroupPopout] = useState(false);
|
||||||
status: false,
|
|
||||||
data: {}
|
|
||||||
})
|
|
||||||
|
|
||||||
const [addGroupPopout, setAddGroupPopout] = useState(false)
|
const handleAddGroup = () => {
|
||||||
|
setAddGroupPopout(true);
|
||||||
const handleAddGroup = () => {
|
};
|
||||||
setAddGroupPopout(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
const handleDeleteGroup = (item) => {
|
|
||||||
setDeletePopout({
|
|
||||||
status: true,
|
|
||||||
data: {...item}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const handleDeleteGroup = (item) => {
|
||||||
|
setDeletePopout({
|
||||||
|
status: true,
|
||||||
|
data: { ...item },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className='p-5 w-full lg:w-[400px] min-h-[300px] bg-sky-100 dark:bg-dark-gray rounded-2xl'>
|
<div className="p-5 w-full lg:w-[400px] min-h-[300px] bg-sky-100 dark:bg-dark-gray rounded-2xl">
|
||||||
{/* <h1 className='mb-5 text-lg lg:text-2xl tracking-wide font-bold text-slate-900 dark:text-slate-100'>Jobs Groups</h1> */}
|
{/* <h1 className='mb-5 text-lg lg:text-2xl tracking-wide font-bold text-slate-900 dark:text-slate-100'>Jobs Groups</h1> */}
|
||||||
<div className='flex justify-end items-center'>
|
<div className="flex justify-end items-center">
|
||||||
<button onClick={handleAddGroup} className='py-2 px-4 flex justify-center items-center bg-sky-blue hover:bg-sky-600 text-base rounded-full text-white font-bold'>Add Group</button>
|
<button
|
||||||
</div>
|
onClick={handleAddGroup}
|
||||||
|
className="py-2 px-4 flex justify-center items-center bg-sky-blue hover:bg-sky-600 text-base rounded-full text-white font-bold"
|
||||||
{groupList && groupList.length < 1 ?
|
>
|
||||||
<h1 className='my-5 text-lg tracking-wide text-slate-900 dark:text-slate-100'>No Group Found!</h1>
|
Add Group
|
||||||
:
|
</button>
|
||||||
<div className='my-4 max-h-[400px] overflow-y-auto'>
|
|
||||||
<div className='flex flex-col'>
|
|
||||||
{groupList.map(item=> (
|
|
||||||
<div key={item.group_uid} className='p-2 flex gap-2 items-center justify-between w-full'>
|
|
||||||
<div className='flex gap-2 items-center'>
|
|
||||||
<input type='radio' name='grouplist' value={item.group_id} checked={selectedGroup?.id == item?.group_id} onChange={changeSelectedGroup} className='w-[20px] h-[20px] outline-none' />
|
|
||||||
<p className='text-sm lg:text-base text-slate-900 dark:text-slate-100'>{item.group_name}</p>
|
|
||||||
</div>
|
|
||||||
<button onClick={()=>{handleDeleteGroup(item)}} className='rounded-lg text-sm bg-red-500 hover:bg-red-400 text-white font-bold py-1 px-2.5 flex justify-center items-center'>X</button>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{deletePopout.status &&
|
|
||||||
<DeleteGroup
|
|
||||||
action={()=>setDeletePopout({status:false, data:{}})}
|
|
||||||
situation={deletePopout.status}
|
|
||||||
details={deletePopout.data}
|
|
||||||
/>
|
|
||||||
}
|
|
||||||
|
|
||||||
{addGroupPopout &&
|
{groupList && groupList.length < 1 ? (
|
||||||
<AddGroup
|
<h1 className="my-5 text-lg tracking-wide text-slate-900 dark:text-slate-100">
|
||||||
action={()=>setAddGroupPopout(false)}
|
No Group Found!
|
||||||
situation={addGroupPopout}
|
</h1>
|
||||||
setUpdateList={setUpdateList}
|
) : (
|
||||||
/>
|
<div className="my-4 max-h-[400px] overflow-y-auto">
|
||||||
}
|
<div className="flex flex-col">
|
||||||
|
{groupList.map((item) => (
|
||||||
|
<div
|
||||||
|
key={item.group_uid}
|
||||||
|
className="p-2 flex gap-2 items-center justify-between w-full"
|
||||||
|
>
|
||||||
|
<div className="flex gap-2 items-center">
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
name="grouplist"
|
||||||
|
value={item.group_id}
|
||||||
|
checked={selectedGroup?.id == item?.group_id}
|
||||||
|
onChange={changeSelectedGroup}
|
||||||
|
className="w-[20px] h-[20px] outline-none"
|
||||||
|
/>
|
||||||
|
<p className="text-sm lg:text-base text-slate-900 dark:text-slate-100">
|
||||||
|
{item.group_name}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
onClick={() => {
|
||||||
|
handleDeleteGroup(item);
|
||||||
|
}}
|
||||||
|
className="flex relative items-center justify-center border-0 w-6 h-6"
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src={localImgLoad("images/icons/remove_grp.svg")}
|
||||||
|
alt="remove-icon"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{deletePopout.status && (
|
||||||
|
<DeleteGroup
|
||||||
|
action={() => setDeletePopout({ status: false, data: {} })}
|
||||||
|
situation={deletePopout.status}
|
||||||
|
details={deletePopout.data}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{addGroupPopout && (
|
||||||
|
<AddGroup
|
||||||
|
action={() => setAddGroupPopout(false)}
|
||||||
|
situation={addGroupPopout}
|
||||||
|
setUpdateList={setUpdateList}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,98 +1,118 @@
|
|||||||
import React, { useState } from 'react'
|
import React, { useState } from "react";
|
||||||
import { handlePagingFunc } from '../Pagination/HandlePagination';
|
import { handlePagingFunc } from "../Pagination/HandlePagination";
|
||||||
import PaginatedList from '../Pagination/PaginatedList';
|
import PaginatedList from "../Pagination/PaginatedList";
|
||||||
import DeleteMember from './DeleteMember';
|
import DeleteMember from "./DeleteMember";
|
||||||
|
import { localImgLoad } from "../../lib";
|
||||||
|
|
||||||
export default function GroupMemberTable({selectedList}) {
|
export default function GroupMemberTable({ selectedList }) {
|
||||||
|
// Handle Pagination
|
||||||
// Handle Pagination
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
const [currentPage, setCurrentPage] = useState(0);
|
const indexOfFirstItem = Number(currentPage);
|
||||||
const indexOfFirstItem = Number(currentPage);
|
const indexOfLastItem =
|
||||||
const indexOfLastItem =Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE);
|
Number(indexOfFirstItem) + Number(process.env.REACT_APP_ITEM_PER_PAGE);
|
||||||
|
|
||||||
const currentSelectedList = selectedList?.slice(indexOfFirstItem, indexOfLastItem);
|
const currentSelectedList = selectedList?.slice(
|
||||||
|
indexOfFirstItem,
|
||||||
const handlePagination = (e) => {
|
indexOfLastItem
|
||||||
handlePagingFunc(e, setCurrentPage);
|
);
|
||||||
};
|
|
||||||
|
|
||||||
const [deletePopout, setDeletePopout] = useState({
|
const handlePagination = (e) => {
|
||||||
status: false,
|
handlePagingFunc(e, setCurrentPage);
|
||||||
data: {}
|
};
|
||||||
})
|
|
||||||
|
|
||||||
const handleDeleteMember = (item) => {
|
const [deletePopout, setDeletePopout] = useState({
|
||||||
setDeletePopout({
|
status: false,
|
||||||
status: true,
|
data: {},
|
||||||
data: {...item}
|
});
|
||||||
})
|
|
||||||
}
|
const handleDeleteMember = (item) => {
|
||||||
|
setDeletePopout({
|
||||||
return (
|
status: true,
|
||||||
<div className={`w-full p-8 bg-white dark:bg-dark-gray overflow-hidden rounded-2xl section-shadow`}>
|
data: { ...item },
|
||||||
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between min-h-[400px]">
|
});
|
||||||
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
};
|
||||||
<tbody>
|
|
||||||
<>
|
return (
|
||||||
{selectedList && selectedList?.length > 0 ? (
|
<div
|
||||||
currentSelectedList.map((value, index) => (
|
className={`w-full p-8 bg-white dark:bg-dark-gray overflow-hidden rounded-2xl section-shadow`}
|
||||||
<tr key={value.uid} className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50">
|
>
|
||||||
{/* <td className="p-1">{value?.firstname}</td>
|
<div className="relative w-full overflow-x-auto sm:rounded-lg flex flex-col justify-between min-h-[400px]">
|
||||||
|
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
|
||||||
|
<tbody>
|
||||||
|
<>
|
||||||
|
{selectedList && selectedList?.length > 0 ? (
|
||||||
|
currentSelectedList.map((value, index) => (
|
||||||
|
<tr
|
||||||
|
key={value.uid}
|
||||||
|
className="bg-white dark:bg-dark-white border-b dark:border-[#5356fb29] hover:bg-gray-50"
|
||||||
|
>
|
||||||
|
{/* <td className="p-1">{value?.firstname}</td>
|
||||||
<td className="p-1">{value?.lastname}</td>
|
<td className="p-1">{value?.lastname}</td>
|
||||||
<td className="p-1">{value?.email}</td>
|
<td className="p-1">{value?.email}</td>
|
||||||
<td className="p-1 text-right">
|
<td className="p-1 text-right">
|
||||||
<button onClick={()=>{handleDeleteMember(value)}} className='rounded-lg text-sm bg-red-500 hover:bg-red-400 text-white font-bold py-1 px-2.5'>X</button>
|
<button onClick={()=>{handleDeleteMember(value)}} className='rounded-lg text-sm bg-red-500 hover:bg-red-400 text-white font-bold py-1 px-2.5'>X</button>
|
||||||
</td> */}
|
</td> */}
|
||||||
<td className='py-2'>
|
<td className="py-2">
|
||||||
<div className="flex flex-col">
|
<div className="flex flex-col">
|
||||||
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
|
<h1 className="font-bold text-xl text-dark-gray dark:text-white">
|
||||||
{value.firstname && value.firstname} {value.lastname && value.lastname}
|
{value.firstname && value.firstname}{" "}
|
||||||
</h1>
|
{value.lastname && value.lastname}
|
||||||
<span className="text-sm text-thin-light-gray">
|
</h1>
|
||||||
{value.email && value.email}
|
<span className="text-sm text-thin-light-gray">
|
||||||
</span>
|
{value.email && value.email}
|
||||||
</div>
|
</span>
|
||||||
</td>
|
</div>
|
||||||
<td className='py-2 text-right'>
|
</td>
|
||||||
<button onClick={()=>{handleDeleteMember(value)}} className='rounded-lg text-sm bg-red-500 hover:bg-red-400 text-white font-bold py-1 px-2.5'>X</button>
|
<td className="py-2 text-right">
|
||||||
</td>
|
<button
|
||||||
</tr>
|
onClick={() => {
|
||||||
))
|
handleDeleteMember(value);
|
||||||
) : (
|
}}
|
||||||
<tr className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
|
className="flex relative items-center justify-center border-0 w-8 h-8"
|
||||||
<td className="p-2">No Members Found</td>
|
>
|
||||||
</tr>
|
<img
|
||||||
)}
|
src={localImgLoad("images/icons/remove_grp.svg")}
|
||||||
</>
|
alt="remove-icon"
|
||||||
</tbody>
|
/>
|
||||||
</table>
|
</button>
|
||||||
|
</td>
|
||||||
{/* PAGINATION BUTTON */}
|
</tr>
|
||||||
<PaginatedList
|
))
|
||||||
onClick={handlePagination}
|
) : (
|
||||||
prev={currentPage == 0 ? true : false}
|
<tr className="font-bold text-xl text-dark-gray dark:text-white whitespace-nowrap">
|
||||||
next={
|
<td className="p-2">No Members Found</td>
|
||||||
currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >=
|
</tr>
|
||||||
selectedList?.length
|
)}
|
||||||
? true
|
</>
|
||||||
: false
|
</tbody>
|
||||||
}
|
</table>
|
||||||
data={selectedList}
|
|
||||||
start={indexOfFirstItem}
|
{/* PAGINATION BUTTON */}
|
||||||
stop={indexOfLastItem}
|
<PaginatedList
|
||||||
/>
|
onClick={handlePagination}
|
||||||
{/* END OF PAGINATION BUTTON */}
|
prev={currentPage == 0 ? true : false}
|
||||||
</div>
|
next={
|
||||||
|
currentPage + Number(process.env.REACT_APP_ITEM_PER_PAGE) >=
|
||||||
{/* DELETE MEMBER POPOUT */}
|
selectedList?.length
|
||||||
{deletePopout.status &&
|
? true
|
||||||
<DeleteMember
|
: false
|
||||||
action={()=>setDeletePopout({status:false, data:{}})}
|
}
|
||||||
situation={deletePopout.status}
|
data={selectedList}
|
||||||
details={deletePopout.data}
|
start={indexOfFirstItem}
|
||||||
/>
|
stop={indexOfLastItem}
|
||||||
}
|
/>
|
||||||
{/* END OF DELETE MEMBER POPOUT */}
|
{/* END OF PAGINATION BUTTON */}
|
||||||
</div>
|
</div>
|
||||||
);
|
|
||||||
};
|
{/* DELETE MEMBER POPOUT */}
|
||||||
|
{deletePopout.status && (
|
||||||
|
<DeleteMember
|
||||||
|
action={() => setDeletePopout({ status: false, data: {} })}
|
||||||
|
situation={deletePopout.status}
|
||||||
|
details={deletePopout.data}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{/* END OF DELETE MEMBER POPOUT */}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,79 +1,119 @@
|
|||||||
import React, { useEffect, useState } from 'react'
|
import React, { useEffect, useState } from "react";
|
||||||
import Layout from '../Partials/Layout'
|
import Layout from "../Partials/Layout";
|
||||||
|
|
||||||
import GroupList from './GroupList'
|
import GroupList from "./GroupList";
|
||||||
import MemberList from './MemberList'
|
import MemberList from "./MemberList";
|
||||||
import LoadingSpinner from '../Spinners/LoadingSpinner'
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
|
|
||||||
import usersService from '../../services/UsersService'
|
import usersService from "../../services/UsersService";
|
||||||
|
|
||||||
export default function JobGroups() {
|
export default function JobGroups() {
|
||||||
|
const userApi = new usersService();
|
||||||
|
|
||||||
const userApi = new usersService();
|
const [updateList, setUpdateList] = useState(false);
|
||||||
|
|
||||||
const [updateList, setUpdateList] = useState(false)
|
const [groupList, setGroupList] = useState({
|
||||||
|
loading: true,
|
||||||
|
groups: [],
|
||||||
|
members: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
const [selectedGroup, setSelectedGroup] = useState({
|
||||||
const [groupList, setGroupList] = useState({
|
id: "",
|
||||||
loading:true,
|
name: "",
|
||||||
groups: [],
|
data: [],
|
||||||
members: []
|
});
|
||||||
})
|
|
||||||
|
|
||||||
const [selectedGroup, setSelectedGroup] = useState({id:'', name:'', data: []})
|
const changeSelectedGroup = (e) => {
|
||||||
|
let groupID = e.target.value;
|
||||||
|
const activeMembers = groupList?.members?.filter(
|
||||||
|
(item) => item.group_id == groupID
|
||||||
|
);
|
||||||
|
const activeGroup = groupList?.groups?.filter(
|
||||||
|
(item) => item.group_id == groupID
|
||||||
|
);
|
||||||
|
setSelectedGroup({
|
||||||
|
id: groupID,
|
||||||
|
name: activeGroup[0]?.group_name,
|
||||||
|
data: activeMembers,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const changeSelectedGroup = (e) => {
|
useEffect(() => {
|
||||||
let groupID = e.target.value
|
setGroupList({ loading: true, groups: [], members: [] });
|
||||||
const activeMembers = groupList?.members?.filter(item => item.group_id == groupID)
|
userApi
|
||||||
const activeGroup = groupList?.groups?.filter(item => item.group_id == groupID)
|
.jobGroupList({})
|
||||||
setSelectedGroup({id: groupID, name:activeGroup[0]?.group_name, data:activeMembers})
|
.then((res) => {
|
||||||
}
|
const { status, data } = res;
|
||||||
|
if (status != 200 || data?.internal_return < 0) {
|
||||||
useEffect(()=>{
|
setGroupList({ loading: false, groups: [], members: [] });
|
||||||
setGroupList({loading: true, groups: [], members: []})
|
return;
|
||||||
userApi.jobGroupList({}).then(res => {
|
}
|
||||||
const {status, data} = res
|
if (data.result_list.length < 0) {
|
||||||
if(status != 200 || data?.internal_return < 0){
|
setGroupList({ loading: false, groups: [], members: [] });
|
||||||
setGroupList({loading: false, groups: [], members: []})
|
return;
|
||||||
return
|
}
|
||||||
}
|
setGroupList({
|
||||||
if(data.result_list.length < 0){
|
loading: false,
|
||||||
setGroupList({loading: false, groups: [], members: []})
|
groups: data.result_list,
|
||||||
return
|
members: data.result_list_member,
|
||||||
}
|
});
|
||||||
setGroupList({loading: false, groups: data.result_list, members: data.result_list_member})
|
if (selectedGroup.id == "") {
|
||||||
if(selectedGroup.id == ''){
|
let activeGroupId = data.result_list[0].group_id;
|
||||||
let activeGroupId = data.result_list[0].group_id
|
let activeGroup = data.result_list[0].group_name;
|
||||||
let activeGroup = data.result_list[0].group_name
|
let activeMembers = data.result_list_member?.filter(
|
||||||
let activeMembers = data.result_list_member?.filter(item => item.group_id == activeGroupId)
|
(item) => item.group_id == activeGroupId
|
||||||
setSelectedGroup({id: activeGroupId, name:activeGroup, data:activeMembers})
|
);
|
||||||
}else{
|
setSelectedGroup({
|
||||||
let activeMembers = data.result_list_member?.filter(item => item.group_id == selectedGroup?.id)
|
id: activeGroupId,
|
||||||
setSelectedGroup({id: selectedGroup?.id, name:selectedGroup?.name, data:activeMembers})
|
name: activeGroup,
|
||||||
}
|
data: activeMembers,
|
||||||
}).catch(error => {
|
});
|
||||||
setGroupList({loading: false, groups: [], members: []})
|
} else {
|
||||||
console.log(error)
|
let activeMembers = data.result_list_member?.filter(
|
||||||
})
|
(item) => item.group_id == selectedGroup?.id
|
||||||
},[updateList])
|
);
|
||||||
|
setSelectedGroup({
|
||||||
|
id: selectedGroup?.id,
|
||||||
|
name: selectedGroup?.name,
|
||||||
|
data: activeMembers,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
setGroupList({ loading: false, groups: [], members: [] });
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
}, [updateList]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout>
|
<Layout>
|
||||||
<div>
|
<div>
|
||||||
<h1 className='mb-5 text-lg lg:text-2xl tracking-wide font-bold text-slate-900 dark:text-slate-100'>Jobs Groups</h1>
|
<h1 className="mb-5 text-lg lg:text-2xl tracking-wide font-bold text-slate-900 dark:text-slate-100">
|
||||||
</div>
|
Jobs Groups
|
||||||
<div className='p-5 w-full min-h-[400px] flex flex-col lg:flex-row gap-3 lg:gap-6 rounded-lg shadow-md bg-white dark:bg-dark-white'>
|
</h1>
|
||||||
{groupList.loading ?
|
</div>
|
||||||
<div className='w-full h-[400px] flex justify-center items-center'>
|
<div className="p-5 w-full min-h-[400px] flex flex-col lg:flex-row gap-3 lg:gap-6 rounded-lg shadow-md bg-white dark:bg-dark-white">
|
||||||
<LoadingSpinner size='16' />
|
{groupList.loading ? (
|
||||||
</div>
|
<div className="w-full h-[400px] flex justify-center items-center">
|
||||||
:
|
<LoadingSpinner size="16" />
|
||||||
<>
|
</div>
|
||||||
<GroupList groupList={groupList?.groups} selectedGroup={selectedGroup} changeSelectedGroup={changeSelectedGroup} setUpdateList={setUpdateList} />
|
) : (
|
||||||
<MemberList groupList={groupList?.groups} selectedGroup={selectedGroup} setUpdateList={setUpdateList} />
|
<>
|
||||||
</>
|
<GroupList
|
||||||
}
|
groupList={groupList?.groups}
|
||||||
</div>
|
selectedGroup={selectedGroup}
|
||||||
|
changeSelectedGroup={changeSelectedGroup}
|
||||||
|
setUpdateList={setUpdateList}
|
||||||
|
/>
|
||||||
|
<MemberList
|
||||||
|
groupList={groupList?.groups}
|
||||||
|
selectedGroup={selectedGroup}
|
||||||
|
setUpdateList={setUpdateList}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</Layout>
|
</Layout>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import GroupMemberTable from "./GroupMemberTable";
|
|||||||
|
|
||||||
import EmailValidator from "../../lib/EmailValidator";
|
import EmailValidator from "../../lib/EmailValidator";
|
||||||
|
|
||||||
import usersService from "../../services/UsersService";
|
|
||||||
import { apiConst } from "../../lib/apiConst";
|
import { apiConst } from "../../lib/apiConst";
|
||||||
|
import usersService from "../../services/UsersService";
|
||||||
|
|
||||||
export default function MemberList({
|
export default function MemberList({
|
||||||
groupList,
|
groupList,
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import { useLocation, useNavigate } from "react-router-dom";
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
import localImgLoad from "../../lib/localImgLoad";
|
|
||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
import { handlePagingFunc } from "../Pagination/HandlePagination";
|
import { handlePagingFunc } from "../Pagination/HandlePagination";
|
||||||
import PaginatedList from "../Pagination/PaginatedList";
|
import PaginatedList from "../Pagination/PaginatedList";
|
||||||
|
|
||||||
export default function MyActiveJobTable({ MyJobList, className }) {
|
export default function MyActiveJobTable({ MyJobList, className }) {
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
let { pathname } = useLocation();
|
let { pathname } = useLocation();
|
||||||
|
|
||||||
@@ -45,7 +43,11 @@ export default function MyActiveJobTable({ MyJobList, className }) {
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
let image = `${MyJobList.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
let image = `${
|
||||||
|
MyJobList.session_image_server
|
||||||
|
}${localStorage.getItem("session_token")}/job/${
|
||||||
|
value.job_uid
|
||||||
|
}`;
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -112,7 +114,7 @@ export default function MyActiveJobTable({ MyJobList, className }) {
|
|||||||
className="px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
className="px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||||
>
|
>
|
||||||
{value.owner_status == "OWNER"
|
{value.owner_status == "OWNER"
|
||||||
? "Manage"
|
? "Review"
|
||||||
: "Send Updates"}
|
: "Send Updates"}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -6,9 +6,7 @@ import PendingJobsPopout from "../jobPopout/PendingJobsPopout";
|
|||||||
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
import { PriceFormatter } from "../Helpers/PriceFormatter";
|
||||||
import localImgLoad from "../../lib/localImgLoad";
|
import localImgLoad from "../../lib/localImgLoad";
|
||||||
|
|
||||||
|
|
||||||
export default function MyPendingJobTable({ MyJobList, className }) {
|
export default function MyPendingJobTable({ MyJobList, className }) {
|
||||||
|
|
||||||
let [jobPopout, setJobPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
|
let [jobPopout, setJobPopout] = useState({ show: false, data: {} }); // STATE TO HOLD THE VALUE OF THE ALERT DETAILS AND DETERMINE WHEN TO SHOW
|
||||||
|
|
||||||
const [currentPage, setCurrentPage] = useState(0);
|
const [currentPage, setCurrentPage] = useState(0);
|
||||||
@@ -19,7 +17,7 @@ export default function MyPendingJobTable({ MyJobList, className }) {
|
|||||||
indexOfFirstItem,
|
indexOfFirstItem,
|
||||||
indexOfLastItem
|
indexOfLastItem
|
||||||
);
|
);
|
||||||
|
|
||||||
const handlePagination = (e) => {
|
const handlePagination = (e) => {
|
||||||
handlePagingFunc(e, setCurrentPage);
|
handlePagingFunc(e, setCurrentPage);
|
||||||
};
|
};
|
||||||
@@ -46,7 +44,11 @@ export default function MyPendingJobTable({ MyJobList, className }) {
|
|||||||
value?.currency_code,
|
value?.currency_code,
|
||||||
value?.currency
|
value?.currency
|
||||||
);
|
);
|
||||||
let image = `${MyJobList.session_image_server}${localStorage.getItem('session_token')}/job/${value.job_uid}`
|
let image = `${
|
||||||
|
MyJobList.session_image_server
|
||||||
|
}${localStorage.getItem("session_token")}/job/${
|
||||||
|
value.job_uid
|
||||||
|
}`;
|
||||||
return (
|
return (
|
||||||
<tr
|
<tr
|
||||||
key={index}
|
key={index}
|
||||||
@@ -107,7 +109,9 @@ export default function MyPendingJobTable({ MyJobList, className }) {
|
|||||||
}}
|
}}
|
||||||
className="px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
className="px-4 h-11 flex justify-center items-center btn-gradient text-base rounded-full text-white"
|
||||||
>
|
>
|
||||||
{value.owner_status == 'OWNER' ? 'Manage' : 'Send Updates'}
|
{value.owner_status == "OWNER"
|
||||||
|
? "Manage"
|
||||||
|
: "View"}
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { Field, Form, Formik } from "formik";
|
import { Field, Form, Formik } from "formik";
|
||||||
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
import React, { useCallback, useEffect, useMemo, useState } from "react";
|
||||||
|
import { useDispatch } from "react-redux";
|
||||||
import * as Yup from "yup";
|
import * as Yup from "yup";
|
||||||
import usersService from "../../services/UsersService";
|
import usersService from "../../services/UsersService";
|
||||||
|
import { tableReload } from "../../store/TableReloads";
|
||||||
import InputCom from "../Helpers/Inputs/InputCom/index";
|
import InputCom from "../Helpers/Inputs/InputCom/index";
|
||||||
import ModalCom from "../Helpers/ModalCom";
|
import ModalCom from "../Helpers/ModalCom";
|
||||||
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
import LoadingSpinner from "../Spinners/LoadingSpinner";
|
||||||
import Detail from "./popoutcomponent/Detail";
|
import Detail from "./popoutcomponent/Detail";
|
||||||
import { tableReload } from "../../store/TableReloads";
|
|
||||||
import { useDispatch } from "react-redux";
|
|
||||||
|
|
||||||
const validationSchema = Yup.object().shape({
|
const validationSchema = Yup.object().shape({
|
||||||
family: Yup.string().required("This is required "),
|
family: Yup.string().required("This is required "),
|
||||||
@@ -23,13 +23,15 @@ 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 [selectedTab, setSelectedTab] = useState('public')
|
const dispatch = useDispatch();
|
||||||
const tabs = ['public', 'individual', 'group']
|
|
||||||
|
|
||||||
const dispatch = useDispatch()
|
const [requestStatus, setRequestStatus] = useState({
|
||||||
|
message: "",
|
||||||
const [requestStatus, setRequestStatus] = useState({message:'', status:false})
|
status: false,
|
||||||
|
});
|
||||||
|
|
||||||
const [familyList, setFamilyList] = useState([]);
|
const [familyList, setFamilyList] = useState([]);
|
||||||
let [loader, setLoader] = useState({
|
let [loader, setLoader] = useState({
|
||||||
@@ -147,7 +149,7 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
|
|||||||
// for group input
|
// for group input
|
||||||
reqData = {
|
reqData = {
|
||||||
...jobReq,
|
...jobReq,
|
||||||
email: '',
|
email: "",
|
||||||
group_id: values?.group,
|
group_id: values?.group,
|
||||||
assign_mode: 110044,
|
assign_mode: 110044,
|
||||||
duration: details?.timeline_days,
|
duration: details?.timeline_days,
|
||||||
@@ -161,50 +163,61 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
|
|||||||
try {
|
try {
|
||||||
const res = await apiCall.assignJobTask(reqData);
|
const res = await apiCall.assignJobTask(reqData);
|
||||||
let { status, data } = await res;
|
let { status, data } = await res;
|
||||||
if(status != 200 || data.internal_return < 0){
|
if (status != 200 || data.internal_return < 0) {
|
||||||
setRequestStatus({message:'Unable to complete', status:false})
|
setRequestStatus({ message: "Unable to complete", status: false });
|
||||||
return setTimeout(()=>{
|
return setTimeout(() => {
|
||||||
setLoader({ jobFields: false });
|
setLoader({ jobFields: false });
|
||||||
setRequestStatus({message:'', status:false})
|
setRequestStatus({ message: "", status: false });
|
||||||
},3000)
|
}, 3000);
|
||||||
}
|
}
|
||||||
dispatch(tableReload({ type: "JOBTABLE" }));
|
dispatch(tableReload({ type: "JOBTABLE" }));
|
||||||
setRequestStatus({message:'Successful', status:true})
|
setRequestStatus({ message: "Successful", status: true });
|
||||||
setTimeout(()=>{
|
setTimeout(() => {
|
||||||
setLoader({ jobFields: false });
|
setLoader({ jobFields: false });
|
||||||
onClose();
|
onClose();
|
||||||
throw new Response(data);
|
throw new Response(data);
|
||||||
},3000)
|
}, 3000);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
setRequestStatus({message:'Unable to complete', status:false})
|
setRequestStatus({ message: "Unable to complete", status: false });
|
||||||
setTimeout(()=>{
|
setTimeout(() => {
|
||||||
setRequestStatus({message:'', status:false})
|
setRequestStatus({ message: "", status: false });
|
||||||
setLoader({ jobFields: false });
|
setLoader({ jobFields: false });
|
||||||
throw new Error(error);
|
throw new Error(error);
|
||||||
},3000)
|
}, 3000);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const [groupList, setGroupList] = useState({loading: true, groups: [], members: []})
|
const [groupList, setGroupList] = useState({
|
||||||
|
loading: true,
|
||||||
|
groups: [],
|
||||||
|
members: [],
|
||||||
|
});
|
||||||
|
|
||||||
// FUNCTION TO POPULATE USER GROUP LIST
|
// FUNCTION TO POPULATE USER GROUP LIST
|
||||||
useEffect(()=>{
|
useEffect(() => {
|
||||||
// setGroupList({loading: true, groups: [], members: []})
|
// setGroupList({loading: true, groups: [], members: []})
|
||||||
apiCall.jobGroupList({}).then(res => {
|
apiCall
|
||||||
const {status, data} = res
|
.jobGroupList({})
|
||||||
if(status != 200 || data?.internal_return < 0){
|
.then((res) => {
|
||||||
setGroupList({loading: false, groups: [], members: []})
|
const { status, data } = res;
|
||||||
return
|
if (status != 200 || data?.internal_return < 0) {
|
||||||
|
setGroupList({ loading: false, groups: [], members: [] });
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if(data.result_list.length < 0){
|
if (data.result_list.length < 0) {
|
||||||
setGroupList({loading: false, groups: [], members: []})
|
setGroupList({ loading: false, groups: [], members: [] });
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
setGroupList({loading: false, groups: data.result_list, members: data.result_list_member})
|
setGroupList({
|
||||||
}).catch(error => {
|
loading: false,
|
||||||
setGroupList({loading: false, groups: [], members: []})
|
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 (
|
||||||
@@ -241,7 +254,7 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="md:grid grid-cols-2 bg-white dark:bg-dark-white rounded-lg shadow-lg">
|
<div className="md:grid grid-cols-2 bg-white dark:bg-dark-white rounded-lg shadow-lg">
|
||||||
<div className="p-4 pb-3 w-full md:border-r-2">
|
<div className="px-4 pb-3 w-full md:border-r-2">
|
||||||
{/* <p className='text-lg font-semibold text-slate-900 tracking-wide'>{details.title}</p> */}
|
{/* <p className='text-lg font-semibold text-slate-900 tracking-wide'>{details.title}</p> */}
|
||||||
|
|
||||||
{/* INPUT SECTION */}
|
{/* INPUT SECTION */}
|
||||||
@@ -264,7 +277,7 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
|
|||||||
<Detail
|
<Detail
|
||||||
label="Created"
|
label="Created"
|
||||||
value={new Date(details?.created).toDateString()}
|
value={new Date(details?.created).toDateString()}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="">
|
<div className="">
|
||||||
@@ -283,166 +296,185 @@ const [requestStatus, setRequestStatus] = useState({message:'', status:false})
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* ACTION SECTION */}
|
{/* ACTION SECTION */}
|
||||||
<div className="p-4 w-ful flex flex-col justify-between">
|
<div className="px-4 pb-3 w-ful flex flex-col justify-between">
|
||||||
<h1 className="text-lg mt-3 font-medium tracking-wide text-black dark:text-white">Send this Task to:</h1>
|
<h1 className="text-lg mt-3 font-medium tracking-wide text-black dark:text-white">
|
||||||
|
Send this Task to:
|
||||||
|
</h1>
|
||||||
<div className="flex flex-col grow">
|
<div className="flex flex-col grow">
|
||||||
<div className="grid grid-cols-3 mt-4">
|
<div className="grid grid-cols-3 mt-4">
|
||||||
{tabs.map(item => (
|
{tabs.map((item) => (
|
||||||
<button
|
<button
|
||||||
// className={`px-4 py-1 rounded-t-2xl ${selectedTab == item ? 'btn-gradient border-[2px] text-white' : 'bg-white text-[#000] border-t-[2px]'}`}
|
// className={`px-4 py-1 rounded-t-2xl ${selectedTab == item ? 'btn-gradient border-[2px] text-white' : 'bg-white text-[#000] border-t-[2px]'}`}
|
||||||
className={`px-4 py-1 rounded-t-2xl border-t-[2px] transition-all duration-200 flex flex-col justify-center items-center ${selectedTab == item ? 'bg-red-50 dark:bg-[#D85A5A] text-slate-600 font-extrabold' : 'bg-white text-[#000]'}`}
|
className={`px-4 py-1 rounded-t-2xl border-t-[2px] transition-all duration-200 flex flex-col justify-center items-center ${
|
||||||
value={item}
|
selectedTab == item
|
||||||
|
? "bg-red-50 dark:bg-[#D85A5A] text-slate-600 font-extrabold"
|
||||||
|
: "bg-white text-[#000]"
|
||||||
|
}`}
|
||||||
|
value={item}
|
||||||
name={item}
|
name={item}
|
||||||
onClick={()=>setSelectedTab(item)}
|
onClick={() => setSelectedTab(item)}
|
||||||
>
|
>
|
||||||
<div className={`mb-[1px] h-6 w-6 border-4 rounded-full transition-all duration-200 ${selectedTab == item ? 'border-white bg-emerald-500' : 'border-red-50 dark:border-[#D85A5A] bg-white'}`}></div>
|
<div
|
||||||
|
className={`mb-[1px] h-6 w-6 border-4 rounded-full transition-all duration-200 ${
|
||||||
|
selectedTab == item
|
||||||
|
? "border-white bg-emerald-500"
|
||||||
|
: "border-red-50 dark:border-[#D85A5A] bg-white"
|
||||||
|
}`}
|
||||||
|
></div>
|
||||||
{item[0].toUpperCase() + item.slice(1)}
|
{item[0].toUpperCase() + item.slice(1)}
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<div className="grow flex flex-col bg-red-50 dark:bg-[#D85A5A] rounded-b-2xl">
|
<div className="grow flex flex-col bg-red-50 dark:bg-[#D85A5A] rounded-b-2xl">
|
||||||
{selectedTab == 'family' &&
|
{selectedTab == "family" && (
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={initialValues}
|
initialValues={initialValues}
|
||||||
validationSchema={validationSchema.fields.family}
|
validationSchema={validationSchema.fields.family}
|
||||||
onSubmit={jobFieldHandler}
|
onSubmit={jobFieldHandler}
|
||||||
>
|
>
|
||||||
{(props) => {
|
{(props) => {
|
||||||
return (
|
return (
|
||||||
<Form className="hidden">
|
<Form className="hidden">
|
||||||
{/* Assign to Family */}
|
{/* Assign to Family */}
|
||||||
<JobFieldInput
|
<JobFieldInput
|
||||||
label="Assign to family"
|
label="Assign to family"
|
||||||
select={true}
|
select={true}
|
||||||
inputName="family"
|
inputName="family"
|
||||||
value={props?.values.family}
|
value={props?.values.family}
|
||||||
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}
|
||||||
parentClass='w-full flex flex-col gap-4'
|
parentClass="w-full flex flex-col gap-4"
|
||||||
/>
|
/>
|
||||||
<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' &&
|
{selectedTab == "public" && (
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={initialValues}
|
initialValues={initialValues}
|
||||||
validationSchema={validationSchema.fields.public}
|
validationSchema={validationSchema.fields.public}
|
||||||
onSubmit={jobFieldHandler}
|
onSubmit={jobFieldHandler}
|
||||||
>
|
>
|
||||||
{(props) => {
|
{(props) => {
|
||||||
return (
|
return (
|
||||||
<Form className="">
|
<Form className="">
|
||||||
{/* Offer this job to public input */}
|
{/* Offer this job to public input */}
|
||||||
<JobFieldInput
|
<JobFieldInput
|
||||||
label="Offer this job to public"
|
label="Offer this job to public"
|
||||||
select={true}
|
select={true}
|
||||||
inputName="public"
|
inputName="public"
|
||||||
value={props?.values.public}
|
value={props?.values.public}
|
||||||
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}
|
||||||
parentClass='w-full flex flex-col gap-4'
|
parentClass="w-full flex flex-col gap-4"
|
||||||
/>
|
/>
|
||||||
<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
|
||||||
|
initialValues={initialValues}
|
||||||
|
validationSchema={validationSchema.fields.individual}
|
||||||
|
onSubmit={jobFieldHandler}
|
||||||
|
>
|
||||||
|
{(props) => {
|
||||||
|
return (
|
||||||
|
<Form className="">
|
||||||
|
{/* Offer this job to individual input */}
|
||||||
|
<JobFieldInput
|
||||||
|
label="Offer this job to individual"
|
||||||
|
input={true}
|
||||||
|
inputName="individual"
|
||||||
|
value={props?.values.individual}
|
||||||
|
placeholder="Enter email of individual"
|
||||||
|
inputHandler={props?.handleChange}
|
||||||
|
btnText="Send Offer to Individual"
|
||||||
|
loader={loader?.jobFields?.individual}
|
||||||
|
errorHandler={errorHandler}
|
||||||
|
parentClass="w-full flex flex-col gap-4"
|
||||||
|
/>
|
||||||
|
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
|
||||||
|
{" "}
|
||||||
|
{props?.values.individual === "" && (
|
||||||
|
<span>{errMsg?.jobFields?.individual}</span>
|
||||||
|
)}
|
||||||
|
</p>{" "}
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Formik>
|
||||||
|
)}
|
||||||
|
|
||||||
{selectedTab == 'individual' &&
|
|
||||||
<Formik
|
|
||||||
initialValues={initialValues}
|
|
||||||
validationSchema={validationSchema.fields.individual}
|
|
||||||
onSubmit={jobFieldHandler}
|
|
||||||
>
|
|
||||||
{(props) => {
|
|
||||||
return (
|
|
||||||
<Form className="">
|
|
||||||
{/* Offer this job to individual input */}
|
|
||||||
<JobFieldInput
|
|
||||||
label="Offer this job to individual"
|
|
||||||
input={true}
|
|
||||||
inputName="individual"
|
|
||||||
value={props?.values.individual}
|
|
||||||
placeholder="Enter email of individual"
|
|
||||||
inputHandler={props?.handleChange}
|
|
||||||
btnText="Send Offer to Individual"
|
|
||||||
loader={loader?.jobFields?.individual}
|
|
||||||
errorHandler={errorHandler}
|
|
||||||
parentClass='w-full flex flex-col gap-4'
|
|
||||||
/>
|
|
||||||
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
|
|
||||||
{" "}
|
|
||||||
{props?.values.individual === "" && (
|
|
||||||
<span>{errMsg?.jobFields?.individual}</span>
|
|
||||||
)}
|
|
||||||
</p>{" "}
|
|
||||||
</Form>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</Formik>
|
|
||||||
}
|
|
||||||
|
|
||||||
{/* { process.env.REACT_APP_SHOW_OFFER_GROUP_JOB != 0 && } */}
|
{/* { process.env.REACT_APP_SHOW_OFFER_GROUP_JOB != 0 && } */}
|
||||||
{selectedTab == 'group' &&
|
{selectedTab == "group" && (
|
||||||
<Formik
|
<Formik
|
||||||
initialValues={initialValues}
|
initialValues={initialValues}
|
||||||
validationSchema={validationSchema.fields.group}
|
validationSchema={validationSchema.fields.group}
|
||||||
onSubmit={jobFieldHandler}
|
onSubmit={jobFieldHandler}
|
||||||
|
>
|
||||||
|
{(props) => {
|
||||||
|
return (
|
||||||
|
<Form className="">
|
||||||
|
{/* Offer this job to your group input */}
|
||||||
|
<JobFieldInput
|
||||||
|
label="Offer this job to your Group"
|
||||||
|
select={true}
|
||||||
|
inputName="group"
|
||||||
|
value={props?.values.group}
|
||||||
|
btnText="Send Order to Group"
|
||||||
|
optionText="Select Group"
|
||||||
|
loader={loader?.jobFields?.group}
|
||||||
|
errorHandler={errorHandler}
|
||||||
|
data={groupList}
|
||||||
|
parentClass="w-full flex flex-col gap-4"
|
||||||
|
/>
|
||||||
|
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
|
||||||
|
{" "}
|
||||||
|
{props?.values.group === "" && (
|
||||||
|
<span>{errMsg?.jobFields?.group}</span>
|
||||||
|
)}
|
||||||
|
</p>
|
||||||
|
</Form>
|
||||||
|
);
|
||||||
|
}}
|
||||||
|
</Formik>
|
||||||
|
)}
|
||||||
|
<p
|
||||||
|
className={`text-center w-full text-lg ${
|
||||||
|
requestStatus.status ? "text-emerald-600" : "text-red-600"
|
||||||
|
}`}
|
||||||
>
|
>
|
||||||
{(props) => {
|
{requestStatus.message && requestStatus.message}
|
||||||
return (
|
</p>
|
||||||
<Form className="">
|
|
||||||
{/* Offer this job to your group input */}
|
|
||||||
<JobFieldInput
|
|
||||||
label="Offer this job to your Group"
|
|
||||||
select={true}
|
|
||||||
inputName="group"
|
|
||||||
value={props?.values.group}
|
|
||||||
btnText="Send Order to Group"
|
|
||||||
optionText="Select Group"
|
|
||||||
loader={loader?.jobFields?.group}
|
|
||||||
errorHandler={errorHandler}
|
|
||||||
data={groupList}
|
|
||||||
parentClass='w-full flex flex-col gap-4'
|
|
||||||
/>
|
|
||||||
<p className="h-4 text-[13px] font-light italic text-red-600 tracking-wide">
|
|
||||||
{" "}
|
|
||||||
{props?.values.group === "" && (
|
|
||||||
<span>{errMsg?.jobFields?.group}</span>
|
|
||||||
)}
|
|
||||||
</p>
|
|
||||||
</Form>
|
|
||||||
);
|
|
||||||
}}
|
|
||||||
</Formik>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{/*
|
||||||
{requestStatus.message &&
|
{requestStatus.message &&
|
||||||
<p className={`mt-4 w-full text-lg ${requestStatus.status ? 'text-emerald-600' : 'text-red-600'}`}>{requestStatus.message}</p>
|
<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>
|
||||||
@@ -480,7 +512,7 @@ const JobFieldInput = ({
|
|||||||
>
|
>
|
||||||
{label && (
|
{label && (
|
||||||
<label
|
<label
|
||||||
className="input-label border-2 w-full border-sky-700 py-4 px-2 text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block tracking-wide"
|
className="input-label border-2 w-full border-sky-700 rounded py-4 px-2 text-[#181c32] dark:text-white text-[13.975px] leading-[20.9625px] font-semibold block tracking-wide"
|
||||||
htmlFor={inputName}
|
htmlFor={inputName}
|
||||||
>
|
>
|
||||||
{label}
|
{label}
|
||||||
@@ -497,51 +529,50 @@ const JobFieldInput = ({
|
|||||||
value={value}
|
value={value}
|
||||||
>
|
>
|
||||||
{/* <option value="">{optionText}</option> */}
|
{/* <option value="">{optionText}</option> */}
|
||||||
{(inputName == 'family' || inputName == 'public') &&
|
{(inputName == "family" || inputName == "public") &&
|
||||||
Array.isArray(data) &&
|
Array.isArray(data) && (
|
||||||
<>
|
<>
|
||||||
<option value="">{optionText}</option>
|
<option value="">{optionText}</option>
|
||||||
{ data?.map((item, idx) => (
|
{data?.map((item, idx) => (
|
||||||
<React.Fragment key={idx}>
|
<React.Fragment key={idx}>
|
||||||
{inputName === "family" && item?.last_login !== "" && (
|
{inputName === "family" &&
|
||||||
<option value={item?.family_uid} key={idx}>
|
item?.last_login !== "" && (
|
||||||
{`${item?.firstname} ${item?.lastname}`}
|
<option value={item?.family_uid} key={idx}>
|
||||||
</option>
|
{`${item?.firstname} ${item?.lastname}`}
|
||||||
)}
|
</option>
|
||||||
{inputName === "public" && (
|
)}
|
||||||
<option value={item?.duration} key={idx}>
|
{inputName === "public" && (
|
||||||
{item?.name}
|
<option value={item?.duration} key={idx}>
|
||||||
</option>
|
{item?.name}
|
||||||
)}
|
</option>
|
||||||
{/* {inputName === "group" && (
|
)}
|
||||||
|
{/* {inputName === "group" && (
|
||||||
<option value={item?.group_id} key={idx}>
|
<option value={item?.group_id} key={idx}>
|
||||||
{item?.group_name}
|
{item?.group_name}
|
||||||
</option>
|
</option>
|
||||||
)} */}
|
)} */}
|
||||||
</React.Fragment>
|
</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 value="">No Group Found</option>
|
{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 value="">No Group Found</option>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</Field>
|
</Field>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user