import AdaptableCard from '@/components/shared/AdaptableCard' import Container from '@/components/shared/Container' import { Badge, Button, Checkbox, Dialog, Menu, toast } from '@/components/ui' import { useConfig } from '@/components/ui/ConfigProvider' import Notification from '@/components/ui/Notification' import { GetPermissionListResultDto, PermissionGrantInfoDto, PermissionGroupDto, PermissionWithGroupName, PermissionWithStyle, ProviderInfoDto, UpdatePermissionDto, } from '@/proxy/admin/models' import { getPermissions, updatePermissions } from '@/services/identity.service' import { useStoreActions, useStoreState } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' import { ChangeEvent, useEffect, useMemo, useState } from 'react' function UsersPermission({ open, onDialogClose, name, id, }: { open: boolean onDialogClose: () => void name: string id: string }) { const providerName = 'U' const { translate } = useLocalization() const { getConfig } = useStoreActions((a) => a.abpConfig) const [isLoading, setIsLoading] = useState(false) const [permissionList, setPermissionList] = useState() const [selectedGroup, setSelectedGroup] = useState() const [selectedGroupPermissions, setSelectedGroupPermissions] = useState( [], ) const mode = useStoreState((state) => state.theme.mode) const { direction } = useConfig() const className = `m${direction[0]}-` const fetchDataPermissions = async () => { if (!id) { return } const response = await getPermissions(providerName, id) setPermissionList(response.data) } 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) } const onDialogOk = async () => { try { setIsLoading(true) if (permissionList?.groups && id) { const listPermissions = await getPermissions(providerName, id) const unChangedPermissions = getPermissionsWithGroupName(listPermissions.data?.groups) const changedPermissions = getPermissionsWithGroupName(permissionList.groups) const updatePermList = changedPermissions .filter( (per) => (unChangedPermissions.find((unChanged) => unChanged.name === per.name) || {}) .isGranted !== per.isGranted, ) .map(({ name, isGranted }) => ({ name, isGranted })) // 🔴 EN KRİTİK SATIR await updatePermissions(providerName, id, { permissions: updatePermList, }) // ✅ permission kaydı bittikten sonra config çek await getConfig(false) toast.push(, { placement: 'top-end', }) } onDialogClose() } catch (err) { console.error(err) } finally { setIsLoading(false) } } function getPermissionsWithGroupName(groups: PermissionGroupDto[]): PermissionWithGroupName[] { return groups.reduce( (acc, val) => [ ...acc, ...val.permissions.map((p) => ({ ...p, groupName: val.name || '', })), ], [] as PermissionWithGroupName[], ) } 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) } 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) } useEffect(() => { fetchDataPermissions() }, [id]) const isGrantedByOtherProviderName = (grantedProviders: ProviderInfoDto[]): boolean => { if (grantedProviders.length) { return grantedProviders.findIndex((p) => p.providerName !== providerName) > -1 } return false } return permissionList ? ( changeGroup(permissionList?.groups[0].name)} onClose={onDialogClose} onRequestClose={onDialogClose} >
{translate('::Permission')} - {name}

{translate('AbpPermissionManagement::SelectAllInAllTabs')}
{translate('AbpPermissionManagement::SelectAllInThisTab')}

{permissionList?.groups.map((group) => ( { changeGroup(group.name) }} > {translate('::' + group.displayName)} ( {group.permissions.filter((a) => a.isGranted).length}) ))}

{selectedGroupPermissions.map((permission) => (
0 ? true : false} checked={permission.isGranted} onChange={() => onClickCheckbox(permission)} > {translate('::' + permission.displayName)} {permission.grantedProviders.map((provider) => ( ))}
))}
) : ( <> ) } export default UsersPermission