import { Box, Button, Checkbox, Flex, Input, InputGroup, InputRightElement, Stack, Table, Tbody, Td, Text, Th, Thead, Tr, useQuery, useToast } from '@chakra-ui/react'; import { FaChevronLeft, FaChevronRight } from "react-icons/fa"; import { Pagination, PaginationContainer, PaginationNext, PaginationPage, PaginationPageGroup, PaginationPrevious, PaginationSeparator, usePagination } from "@ajna/pagination"; import React, { useEffect, useState } from 'react'; import { __ } from "@wordpress/i18n"; import { SearchIcon } from '@chakra-ui/icons'; import { Select } from 'chakra-react-select'; import { bulkAssignPermission, bulkRemoveManager, getManagers, getWPRoles, removeManager } from './RoleAndPermissionAPI'; import TrashUserRoleModel from './TrashUserRoleModel'; import UserDisplayModal from './UserDisplayModal'; import { debounce } from "lodash"; const UserRoleTable = () => { const [isAllChecked, setIsAllChecked] = useState(false); const [evfPermission, setEvfPermission] = useState([]); const [checkedItems, setCheckedItems] = useState({}); const [firstLoad,setFirstLoad] = useState(true); const [managers, setManagers] = useState([]); const [permissions, setPermissions] = useState([]); const [wpRoles, setWPRoles] = useState([]); const [userDeleted, setUserDeleted] = useState(false); const [selectedRows, setSelectedRows] = useState([]); const [bulkDelete, setBulkDelete] = useState(false); const [bulkDeleteSuccess, setBulkDeleteSuccess] = useState(); const [searchManager, setSearchManager] = useState(""); const [userAdded, setUserAdded] = useState(false); const toast = useToast(); const [totalManagers, setTotalManagers] = useState(0); const mappedOptions = [ { label: 5, value: 5 }, { label: 10, value: 10 }, { label: 25, value: 25 }, { label: 50, value: 50 }, ]; const outerLimit = 2; const innerLimit = 2; const { pages, pagesCount, offset, currentPage, setCurrentPage, isDisabled, pageSize, setPageSize, } = usePagination({ total: totalManagers, limits: { outer: outerLimit, inner: innerLimit, }, initialState: { pageSize: 5, isDisabled: false, currentPage: 1, }, }); const handlePageChange = (nextPage) => { setCurrentPage(nextPage); }; const handlePageSizeChange = ( selectedOption ) => { const pageSize = Number( selectedOption .value); setPageSize(pageSize); }; const debounceSearch = debounce((val) => { setCurrentPage(1); setSearchManager(val); }, 800); useEffect(()=>{ getManagers( offset, pageSize, searchManager ).then((res)=> { if ( res.success ) { setUserAdded(false); setUserDeleted(false); setManagers( res.managers ); setTotalManagers(res.total) setPermissions( res.permissions.permissions); } }) },[currentPage, pageSize, offset, userDeleted, bulkDeleteSuccess, searchManager, userAdded]); useEffect(() => { getWPRoles().then((res) => { setWPRoles(res.data.roles); }); }, []); const deleteManager = (userID) => { removeManager(userID).then((res) => { if (res.success) { setUserDeleted(true); toast({ title: res.message, status: "success", duration: 3000, }); } }); }; const handleSelectAll = (isChecked) => { if (isChecked) { setSelectedRows(managers.map((manager) => manager.id)); } else { setSelectedRows([]); } }; const handleSelectRow = (id, isChecked) => { setSelectedRows((prevSelected) => isChecked ? [...prevSelected, id] : prevSelected.filter((rowId) => rowId !== id) ); }; const isAllSelected = managers.length > 0 && selectedRows.length === managers.length; const isIndeterminate = selectedRows.length > 0 && selectedRows.length < managers.length; const handleCheckAll = (e) => { setFirstLoad(false); const checked = e.target.checked; setIsAllChecked(checked); const updatedCheckedItems = Object.keys(wpRoles).reduce((acc, role) => { acc[role] = checked; return acc; }, {}); setCheckedItems(updatedCheckedItems); bulkAssignPermission(updatedCheckedItems).then((res) => { if (res.success) { toast({ title: res.message, status: "success", duration: 3000, }); } else { toast({ title: res.message || "Something went wrong", status: "error", duration: 3000, }); } }); }; const handleIndividualCheck = (role, isChecked) => { setFirstLoad(false); const updatedCheckedItems = { ...checkedItems, [role]: isChecked, }; setCheckedItems(updatedCheckedItems); bulkAssignPermission(updatedCheckedItems).then((res) => { if (res.success) { toast({ title: res.message, status: "success", duration: 3000, }); } else { toast({ title: res.message || "Something went wrong", status: "error", duration: 3000, }); } }); const allChecked = Object.values(updatedCheckedItems).every((item) => item); setIsAllChecked(allChecked); }; useEffect(() => { getWPRoles().then((res) => { setWPRoles(res.data.roles); setEvfPermission(res.data.permission.permissions); const initialCheckedItems = Object.keys(res.data.roles).reduce((acc, role) => { acc[role] = res.data.roles[role].checked; return acc; }, {}); setCheckedItems(initialCheckedItems); }); }, []); const handleBulkDelete = () => { if ( selectedRows.length === 0 ) { toast({ title: "Please select user.", status: 'error', duration: 3000 }) }else if ( !bulkDelete ) { toast({ title: "Please choose bulk action.", status: 'error', duration: 3000 }) }else if( bulkDelete && selectedRows.length != 0 ){ bulkRemoveManager( selectedRows ).then( (res) => { if ( res.success ) { toast({ title: res.message, status: 'success', duration: 3000 }) setBulkDeleteSuccess(true); setSelectedRows([]); }else{ toast({ title: res.message, status: 'error', duration: 3000 }) } }) } } return ( {/* Role Based */} Role Based By selecting additional roles below, you can give access to other user roles. handleCheckAll(e)} > Check All {Object.entries(wpRoles).map(([roleKey, roleName]) => ( handleIndividualCheck(roleKey, e.target.checked)} > {roleName.name} ))} {/* User Role Table */} } /> debounceSearch(e.target.value)} /> } > {pages?.map((page) => ( ))} ); }; export default UserRoleTable;