import classNames from 'classnames' import { FaChevronRight, FaChevronDown } from 'react-icons/fa' import { Badge, Button, Checkbox, Dialog, Input, Menu } from '@/components/ui' import { useConfig } from '@/components/ui/ConfigProvider' import { useDialogContext } from '@/components/ui/Dialog/Dialog.context' import { GetPermissionListResultDto, PermissionGrantInfoDto, PermissionGroupDto, PermissionWithGroupName, PermissionWithStyle, } from '@/proxy/admin/models' import { getPermissions, updatePermissions } from '@/services/identity.service' import { useStoreActions, useStoreState } from '@/store' import { useLocalization } from '@/utils/hooks/useLocalization' import { ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react' import { notifySuccess } from '@/utils/notify' type OpenState = Record function UserPermissionDialogContent({ name, translate, permissionList, selectedGroup, filteredPermissions, isAllSelected, isAllSelectedForGroup, isLoading, searchTerm, openPermissions, mode, providerName, onSelectAll, onDialogClose, onDialogOk, handleExpandAll, handleCollapseAll, changeGroup, togglePermission, isParent, onClickCheckbox, setSearchTerm, }: any) { const { isMaximized } = useDialogContext() return ( <>
{translate('::App.Platform.Permission')} - {name}

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

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

setSearchTerm(e.target.value)} />
{filteredPermissions.map((permission: any) => { const isParentPerm = isParent(permission) const permKey = permission.name || '' return (
{isParentPerm ? ( ) : (
)} onClickCheckbox(permission)} disabled={permission.grantedProviders.some( (provider: any) => provider.providerName === 'R', )} > {translate('::' + permission.displayName)} {permission.grantedProviders.map((provider: any) => { const badgeContent = provider.providerName !== providerName ? `${provider.providerName}: ${provider.providerKey}` : provider.providerName return ( ) })}
) })}
) } 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( [], ) // Collapse/expand state const [openPermissions, setOpenPermissions] = useState({}) // Parent izinleri aç/kapat const togglePermission = (permName: string) => { setOpenPermissions((prev) => ({ ...prev, [permName]: !prev[permName] })) } // Parent izin mi? function isParent(permission: PermissionWithStyle) { return selectedGroupPermissions.some((p) => p.parentName === permission.name) } // Belirli parent'ın alt izinleri const getChildren = useCallback( (parentName: string) => parentName ? selectedGroupPermissions.filter((p) => p.parentName === parentName) : [], [selectedGroupPermissions], ) // --- Expand/Collapse All fonksiyonları --- const handleExpandAll = () => { const expanded: OpenState = {} function expandRecursively(perms: PermissionWithStyle[]) { perms.forEach((perm) => { if (isParent(perm)) { expanded[perm.name || ''] = true const children = getChildren(perm.name || '') expandRecursively(children) } }) } expandRecursively(selectedGroupPermissions) setOpenPermissions(expanded) } const handleCollapseAll = () => { setOpenPermissions({}) } const mode = useStoreState((state) => state.theme.mode) const { direction } = useConfig() const className = `m${direction[0]}-` const fetchDataPermissions = useCallback(async () => { if (!id) { return } const response = await getPermissions(providerName, id) setPermissionList(response.data) }, [id]) 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) notifySuccess('Permission updated') } 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() }, [fetchDataPermissions]) // --- Search ve recursive treeview --- // Collapse/expand için recursive düzende izinleri döndür const [searchTerm, setSearchTerm] = useState('') const filteredPermissions = useMemo(() => { const lowerTerm = searchTerm.toLowerCase() // Filtreli veya tüm parent izinler const parents = selectedGroupPermissions.filter( (p) => !p.parentName && (searchTerm === '' || translate('::' + p.displayName) .toLowerCase() .includes(lowerTerm)), ) // Recursive children builder (her seviye için doğru level) function buildTree( parent: PermissionWithStyle, level: number, ): (PermissionWithStyle & { level: number })[] { const arr = [{ ...parent, level }] const parentKey = parent.name || '' if (openPermissions[parentKey] || searchTerm) { const children = getChildren(parentKey) children.forEach((child) => { arr.push(...buildTree(child, level + 1)) }) } return arr } let result: (PermissionWithStyle & { level: number })[] = [] parents.forEach((parent) => { result = result.concat(buildTree(parent, 0)) }) return result }, [selectedGroupPermissions, searchTerm, translate, openPermissions, getChildren]) return permissionList ? ( changeGroup(permissionList?.groups[0].name)} onClose={onDialogClose} onRequestClose={onDialogClose} > ) : ( <> ) } export default UsersPermission