import { ActionLink } from '@/components/shared' import AdaptableCard from '@/components/shared/AdaptableCard' import Container from '@/components/shared/Container' import { Table, toast } from '@/components/ui' import { useConfig } from '@/components/ui/ConfigProvider' import Notification from '@/components/ui/Notification' import { getPermissions, getUsers, updatePermissions } from '@/services/identity.service' import { useStoreState } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' import useThemeClass from '@/utils/hooks/useThemeClass' import isEmpty from 'lodash/isEmpty' import { ChangeEvent, useEffect, useMemo, useState } from 'react' import { Helmet } from 'react-helmet' import UsersPermission from './UsersPermission' import { GetPermissionListResultDto, IdentityUserDto, PermissionGrantInfoDto, PermissionGroupDto, PermissionWithGroupName, PermissionWithStyle, UpdatePermissionDto, } from '@/proxy/admin/models' const { Tr, Th, Td, THead, TBody } = Table const Users = () => { const providerName = 'U' const { textTheme } = useThemeClass() const [isLoading, setIsLoading] = useState(false) const [userList, setUserList] = useState([]) const [activeUser, setActiveUser] = useState() const [permissionList, setPermissionList] = useState() const [selectedGroup, setSelectedGroup] = useState() const [selectedGroupPermissions, setSelectedGroupPermissions] = useState( [], ) const [permissionDialogOpen, setPermissionDialogOpen] = useState(false) const mode = useStoreState((state) => state.theme.mode) const { translate } = useLocalization() const fetchData = async () => { const response = await getUsers() if (response.data?.items) { setUserList(response.data.items) } } useEffect(() => { if (isEmpty(userList)) { fetchData() } // eslint-disable-next-line react-hooks/exhaustive-deps }, []) const fetchDataPermissions = async (user?: IdentityUserDto, userid?: string) => { if (!user || !userid) { return } setActiveUser(user) const response = await getPermissions(providerName, userid) setPermissionList(response.data) } const onDialogClose = async () => { setPermissionDialogOpen(false) setSelectedGroup(undefined) setSelectedGroupPermissions([]) await fetchDataPermissions(activeUser, activeUser?.id) } function getPermissionsWithGroupName(groups: PermissionGroupDto[]): PermissionWithGroupName[] { return groups.reduce( (acc, val) => [ ...acc, ...val.permissions.map((p) => ({ ...p, groupName: val.name || '', })), ], [] as PermissionWithGroupName[], ) } const onDialogOk = async () => { setIsLoading(true) setTimeout(async () => { if (permissionList?.groups && activeUser?.id) { const listPermissions = await getPermissions(providerName, activeUser.id) const unChangedPermissions = getPermissionsWithGroupName(listPermissions.data?.groups) const changedPermissions = getPermissionsWithGroupName(permissionList.groups) const updatePermList: UpdatePermissionDto[] = changedPermissions .filter((per) => (unChangedPermissions.find((unChanged) => unChanged.name === per.name) || {}) .isGranted === per.isGranted ? false : true, ) .map(({ name, isGranted }) => ({ name, isGranted })) updatePermissions(providerName, activeUser.id, { permissions: updatePermList }) toast.push(, { placement: 'top-center', }) } setPermissionDialogOpen(false) setIsLoading(false) }, 1000) } const { direction } = useConfig() const className = `m${direction[0]}-` function findMargin( permissions: PermissionGrantInfoDto[], permission: PermissionGrantInfoDto, level = 0, ): number { const parentPermission = permissions.find((per) => per.name === permission.parentName) if (parentPermission) { return findMargin(permissions, parentPermission, level + 1) } else { return level } } const isAllSelected = useMemo( () => permissionList?.groups.every((group) => group.permissions.every((permission) => permission.isGranted), ), [permissionList], ) const isAllSelectedForGroup = useMemo( () => selectedGroupPermissions.every((permission) => permission.isGranted), [selectedGroupPermissions], ) const onSelectAll = (value: boolean, e: ChangeEvent) => { if (!permissionList) { return } const currentGroupName = selectedGroup?.name setSelectedGroup(undefined) setSelectedGroupPermissions([]) if (e.target.name === 'group') { permissionList?.groups .find((group) => group.name === selectedGroup?.name) ?.permissions.forEach((permission) => { permission.isGranted = value }) } else { permissionList?.groups.forEach((group) => { group.permissions.forEach((permission) => { permission.isGranted = value }) }) } setPermissionList({ ...permissionList }) changeGroup(currentGroupName) } const changeGroup = (groupName?: string) => { const group = permissionList?.groups.find((a) => a.name === groupName) if (!group) { setSelectedGroup(undefined) setSelectedGroupPermissions([]) return } setSelectedGroup(group) const selectedGroupPerm = group.permissions.map( (permission) => ({ ...permission, class: className + findMargin(group.permissions, permission) * 4, }) as PermissionWithStyle, ) setSelectedGroupPermissions(selectedGroupPerm) } function onClickCheckbox(clickedPermission: PermissionGrantInfoDto) { if (!permissionList) { return } const groupPerm = selectedGroupPermissions.map((per) => { if (clickedPermission.name === per.name) { return { ...per, isGranted: !per.isGranted } } else if (clickedPermission.name === per.parentName && clickedPermission.isGranted) { return { ...per, isGranted: false } } else if (clickedPermission.parentName === per.name && !clickedPermission.isGranted) { return { ...per, isGranted: true } } return per }) const permGroup = permissionList?.groups.find((a) => a.name === selectedGroup?.name) if (permGroup) { permGroup.permissions = groupPerm } setPermissionList({ ...permissionList }) setSelectedGroupPermissions(groupPerm) } return ( <> {userList.map((user) => ( ))}
Adı Soyadı E-Posta Telefon Durum
{ await fetchDataPermissions(user, user?.id) setPermissionDialogOpen(true) }} > {translate('::Permission')}
{user.name} {user.surname} {user.email} {user.phoneNumber} {user.isActive ? 'Aktif' : 'Pasif'}
{activeUser?.id && ( setPermissionDialogOpen(false)} name={activeUser.id} id={''} > )} ) } export default Users