Untitled
unknown
plain_text
10 months ago
14 kB
4
Indexable
import { useEffect, useState } from "react";
import { useForm, Controller } from "react-hook-form";
import { useStudyMaterialStore } from "../../store/StudyMaterialStore";
import { CardBox } from "../user/UserProfile";
import Select from "react-select";
import { assign, filter, map, size } from "lodash";
import { Box, Button, Flex, HStack, IconButton, Tag, Text, Tooltip, useDisclosure, VStack } from "@chakra-ui/react";
import { useUpdateMemberData } from "../../services/member.service";
import { ErrorAlert, SuccessAlert } from "../../utils/Helper";
import {
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalFooter,
ModalBody,
ModalCloseButton,
} from '@chakra-ui/react'
import {
Table,
Thead,
Tbody,
Tr,
Th,
Td,
TableContainer,
} from '@chakra-ui/react'
import moment from "moment";
import { RxCross2 } from "react-icons/rx";
import { ConfirmAlert } from "../../components/ConfirmAler";
import { FaUserXmark } from "react-icons/fa6";
import { useAuth } from "../../context/auth";
import { PERMISSIONS } from "../../app/data/permissions";
export const StudyMaterial = ({ staffmemberid, staffMember, refetch, userData }) => {
const { getModulesAction, studyMaterialModules } = useStudyMaterialStore();
const [isOpenConfirm, setIsOpenConfirm] = useState(false)
const [type, setType] = useState('')
const { isOpen, onOpen, onClose } = useDisclosure()
const {hasPermission} = useAuth()
const onOpenConfirm = (data) => {
setIsOpenConfirm({ data })
}
const onCloseConfirm = () => {
setIsOpenConfirm(false)
}
const { control, handleSubmit, reset } = useForm({
defaultValues: {
studyMaterials: [],
},
});
useEffect(() => {
getModulesAction();
}, [getModulesAction]);
const { mutate, isPending } = useUpdateMemberData({
onSuccess: () => {
refetch();
if (type === 'UN') {
SuccessAlert("Study materials unassigned successfully!");
setType(null)
onCloseConfirm()
} else {
SuccessAlert("Study materials assigned successfully!");
}
reset()
},
onError: () => {
if (type === 'UN') {
setType(null)
ErrorAlert("Failed to un-assign study materials.");
} else {
ErrorAlert("Failed to assign study materials.");
}
},
});
const alreadyAssignedIds = map(staffMember?.studyMaterials || [], (assigned) => assigned?.studyMaterial?._id) || [];
const activeStudyMaterials = filter(studyMaterialModules, (s) =>
s.isActive
);
const availableStudyMaterials = filter(
activeStudyMaterials,
(s) => !alreadyAssignedIds.includes(s._id)
);
const studyMaterialOption = map(availableStudyMaterials, (s) => ({
label: `${s?.name}_${s.subject} (${s?.moduleCode})`,
value: s?._id,
}));
const onSubmit = (data) => {
const existingStudyMaterials = staffMember?.studyMaterials?.map((assigned) => ({
studyMaterial: assigned.studyMaterial,
assignedBy: assigned.assignedBy?._id,
assignedTo: assigned.assignedTo,
assignedAt: assigned.assignedAt,
unassigned: assigned.unassigned,
unassignedBy:assigned.unassignedBy,
unassignedAt:assigned.unassignedAt,
})) || [];
const newStudyMaterials = data.studyMaterials?.map((material) => ({
studyMaterial: material.value,
assignedBy: userData?.staff?._id,
assignedTo: staffmemberid,
assignedAt: new Date(),
}));
const payload = {
id: staffmemberid,
studyMaterials: [...existingStudyMaterials, ...newStudyMaterials],
};
mutate(payload);
};
const handleClear = () => {
reset({ studyMaterials: [] });
};
const hanldeUnassign = (type) => {
setType(type)
const payload = {
id: staffmemberid,
studyMaterials: staffMember?.studyMaterials?.map((s) => {
if (s._id === isOpenConfirm?.data?._id) {
return {
...s,
unassigned: true,
unassignedBy: userData?.staff?._id,
unassignedAt: new Date(),
};
}
return s;
}),
};
mutate(payload);
};
return (
<CardBox heading="Study Materials">
<Flex justifyContent={'flex-end'}>
<Box mr={2}>
<Tooltip label="Unassigned History" aria-label="Unassigned History" >
<IconButton icon={<FaUserXmark />} colorScheme="blue" size="md" onClick={onOpen} >
</IconButton>
</Tooltip>
</Box>
<Tag p={2} colorScheme="gray" >Total Unassigned : {size(filter(staffMember?.studyMaterials, (s) => s.unassigned || s.unassigned === true))}</Tag>
<Tag p={2} ml={2} colorScheme="blue" >Total Assigned : {size(filter(staffMember?.studyMaterials, (s) => !s.unassigned || s.unassigned !== true))}</Tag>
</Flex>
<form onSubmit={handleSubmit(onSubmit)}>
<VStack spacing={4} align="stretch" w="100%">
<Flex>
<Box ml={4}>
<Controller
name="studyMaterials"
control={control}
render={({ field }) => (
<Select
{...field}
isMulti
options={studyMaterialOption}
isSearchable
isClearable
styles={{
container: (base) => ({
...base,
width: "400px",
}),
control: (base) => ({
...base,
fontSize: "16px",
}),
}}
/>
)}
/>
</Box>
<Box w="100%" ml={2}>
<HStack spacing={4}>
<Button
colorScheme="blue"
type="submit"
isLoading={isPending && !type}
>
Assign
</Button>
<Button colorScheme="gray" onClick={handleClear}>
Clear
</Button>
</HStack>
</Box>
</Flex>
<Box>
<TableContainer>
<Table variant='simple'>
<Thead>
<Tr bgColor={'gray.100'}>
<Th>S.No.</Th>
<Th>Study Material</Th>
<Th>Module Code</Th>
<Th>Subject</Th>
<Th>Assigned By</Th>
<Th>Assigned At</Th>
{hasPermission(PERMISSIONS.UNASSIGN_STUDY_MATERIAL_STAFF,PERMISSIONS.USER_TYPE_ADMIN,PERMISSIONS.USER_TYPE_SUPERADMIN)&&<Th>Action</Th>}
</Tr>
</Thead>
{size(staffMember?.studyMaterials) > 0 ? <Tbody>
{filter(staffMember?.studyMaterials, (s, i) => s.unassigned !== true || !s.unassigned)?.map((s, i) => {
return (
<Tr key={i}>
<Td>{i + 1}.</Td>
<Td>{s?.studyMaterial?.name}</Td>
<Td>{s?.studyMaterial?.moduleCode}</Td>
<Td>{s?.studyMaterial?.subject}</Td>
<Td>{s?.assignedBy?.name}</Td>
<Td>{moment(s?.assignedAt).format('DD MMM YYYY')}</Td>
<Td>
{hasPermission(PERMISSIONS.UNASSIGN_STUDY_MATERIAL_STAFF,PERMISSIONS.USER_TYPE_ADMIN,PERMISSIONS.USER_TYPE_SUPERADMIN)&& <Tooltip label="Unassign Study Material" aria-label="Unassign Study Material">
<IconButton
name="delete"
color="red"
size={20}
icon={<RxCross2 />
}
onClick={() => onOpenConfirm(s)} />
</Tooltip>}
</Td>
</Tr>
)
})}
</Tbody> : <Text mt={4} color={'gray.500'}>No Study Materials Assigned</Text>}
</Table>
</TableContainer>
</Box>
</VStack>
</form>
{isOpenConfirm && <ConfirmAlert isOpen={isOpenConfirm} onClose={onCloseConfirm} message={'Are you Sure to unassign this Study Material'}
heading={'Confirm ALert'} onConfirm={() => hanldeUnassign('UN')} loading={isPending} />}
{isOpen && <UnassignedHistory isOpen={isOpen} onClose={onClose} studyMaterial={staffMember?.studyMaterials} />}
</CardBox>
);
};
const UnassignedHistory = ({ isOpen, onClose, studyMaterial }) => {
return (
<Modal isOpen={isOpen} onClose={onClose} size={'6xl'} >
<ModalOverlay />
<ModalContent>
<ModalHeader bgColor={'gray.100'}>Unassign History</ModalHeader>
<ModalCloseButton />
<ModalBody>
<Box>
<TableContainer>
<Table variant='simple' size={'sm'}>
<Thead>
<Tr bgColor={'gray.100'}>
<Th>S.No.</Th>
<Th>Study Material</Th>
<Th>Module Code</Th>
<Th>Subject</Th>
<Th>Assigned By</Th>
<Th>Assigned At</Th>
<Th>Unassigned By</Th>
<Th>Unassigned At</Th>
</Tr>
</Thead>
{size(studyMaterial) > 0 ? <Tbody>
{filter(studyMaterial, (s, i) => s.unassigned === true || s.unassigned)?.map((s, i) => {
return (
<Tr key={i}>
<Td>{i + 1}.</Td>
<Td>{s?.studyMaterial?.name}</Td>
<Td>{s?.studyMaterial?.moduleCode}</Td>
<Td>{s?.studyMaterial?.subject}</Td>
<Td>{s?.assignedBy?.name}</Td>
<Td>{moment(s?.assignedAt).format('DD MMM YYYY')}</Td>
<Td>{s?.unassignedBy?.name}</Td>
<Td>{moment(s?.unassignedAt).format('DD MMM YYYY')}</Td>
</Tr>
)
})}
</Tbody> : <Text mt={4} color={'gray.500'}>No Study Materials Unassigned</Text>}
</Table>
</TableContainer>
</Box>
</ModalBody>
</ModalContent>
</Modal>
)
}
Editor is loading...
Leave a Comment