|
|
@ -6,11 +6,11 @@ import { IconBtn } from '@/components/IconBtn';
|
|
|
|
import { Loading } from '@/components/Loading';
|
|
|
|
import { Loading } from '@/components/Loading';
|
|
|
|
import { PillTabPane, PillTabs } from '@/components/PillTabs';
|
|
|
|
import { PillTabPane, PillTabs } from '@/components/PillTabs';
|
|
|
|
import { UserListItem } from '@/components/UserListItem';
|
|
|
|
import { UserListItem } from '@/components/UserListItem';
|
|
|
|
|
|
|
|
import { AllPermission, permissionList } from '@/utils/role-helper';
|
|
|
|
import { Button, Input } from 'antd';
|
|
|
|
import { Button, Input } from 'antd';
|
|
|
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
|
|
import React, { useCallback, useMemo, useState } from 'react';
|
|
|
|
import { Icon } from 'tailchat-design';
|
|
|
|
import { Icon } from 'tailchat-design';
|
|
|
|
import { t, useGroupInfo, useSearch, useUserInfoList } from 'tailchat-shared';
|
|
|
|
import { t, useGroupInfo, useSearch, useUserInfoList } from 'tailchat-shared';
|
|
|
|
import { permissionList } from './const';
|
|
|
|
|
|
|
|
import { PermissionItem } from './PermissionItem';
|
|
|
|
import { PermissionItem } from './PermissionItem';
|
|
|
|
import { RoleItem } from './RoleItem';
|
|
|
|
import { RoleItem } from './RoleItem';
|
|
|
|
import { useModifyPermission } from './useModifyPermission';
|
|
|
|
import { useModifyPermission } from './useModifyPermission';
|
|
|
@ -21,7 +21,9 @@ interface GroupPermissionProps {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
|
|
|
|
export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
|
|
|
|
const { groupId } = props;
|
|
|
|
const { groupId } = props;
|
|
|
|
const [roleId, setRoleId] = useState('');
|
|
|
|
const [roleId, setRoleId] = useState<typeof AllPermission | string>(
|
|
|
|
|
|
|
|
AllPermission
|
|
|
|
|
|
|
|
);
|
|
|
|
const groupInfo = useGroupInfo(groupId);
|
|
|
|
const groupInfo = useGroupInfo(groupId);
|
|
|
|
const roles = groupInfo?.roles ?? [];
|
|
|
|
const roles = groupInfo?.roles ?? [];
|
|
|
|
const members = (groupInfo?.members ?? []).filter((m) => m.role === roleId);
|
|
|
|
const members = (groupInfo?.members ?? []).filter((m) => m.role === roleId);
|
|
|
@ -39,10 +41,13 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
|
|
|
|
() => roles.find((r) => r._id === roleId),
|
|
|
|
() => roles.find((r) => r._id === roleId),
|
|
|
|
[roles, roleId]
|
|
|
|
[roles, roleId]
|
|
|
|
);
|
|
|
|
);
|
|
|
|
const currentRolePermissions = useMemo(
|
|
|
|
const currentRolePermissions: string[] = useMemo(() => {
|
|
|
|
() => currentRoleInfo?.permissions ?? [],
|
|
|
|
if (roleId === AllPermission) {
|
|
|
|
[currentRoleInfo]
|
|
|
|
return groupInfo?.fallbackPermissions ?? [];
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return currentRoleInfo?.permissions ?? [];
|
|
|
|
|
|
|
|
}, [roleId, currentRoleInfo, groupInfo]);
|
|
|
|
|
|
|
|
|
|
|
|
const {
|
|
|
|
const {
|
|
|
|
loading,
|
|
|
|
loading,
|
|
|
@ -71,7 +76,10 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
|
|
|
|
<div className="flex h-full">
|
|
|
|
<div className="flex h-full">
|
|
|
|
<div className="pr-2 mr-2 w-40 border-r border-white border-opacity-20">
|
|
|
|
<div className="pr-2 mr-2 w-40 border-r border-white border-opacity-20">
|
|
|
|
{/* 角色列表 */}
|
|
|
|
{/* 角色列表 */}
|
|
|
|
<RoleItem active={roleId === ''} onClick={() => setRoleId('')}>
|
|
|
|
<RoleItem
|
|
|
|
|
|
|
|
active={roleId === AllPermission}
|
|
|
|
|
|
|
|
onClick={() => setRoleId(AllPermission)}
|
|
|
|
|
|
|
|
>
|
|
|
|
{t('所有人')}
|
|
|
|
{t('所有人')}
|
|
|
|
</RoleItem>
|
|
|
|
</RoleItem>
|
|
|
|
|
|
|
|
|
|
|
@ -92,7 +100,11 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
|
|
|
|
|
|
|
|
|
|
|
|
<div className="flex-1 overflow-y-auto">
|
|
|
|
<div className="flex-1 overflow-y-auto">
|
|
|
|
<PillTabs defaultActiveKey="permission">
|
|
|
|
<PillTabs defaultActiveKey="permission">
|
|
|
|
<PillTabPane key="summary" tab={t('概述')} disabled={!roleId}>
|
|
|
|
<PillTabPane
|
|
|
|
|
|
|
|
key="summary"
|
|
|
|
|
|
|
|
tab={t('概述')}
|
|
|
|
|
|
|
|
disabled={roleId === AllPermission}
|
|
|
|
|
|
|
|
>
|
|
|
|
{/* 权限概述 */}
|
|
|
|
{/* 权限概述 */}
|
|
|
|
{currentRoleInfo && (
|
|
|
|
{currentRoleInfo && (
|
|
|
|
<div className="px-2">
|
|
|
|
<div className="px-2">
|
|
|
@ -131,7 +143,11 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
|
|
|
|
/>
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
))}
|
|
|
|
</PillTabPane>
|
|
|
|
</PillTabPane>
|
|
|
|
<PillTabPane key="member" tab={t('管理成员')} disabled={!roleId}>
|
|
|
|
<PillTabPane
|
|
|
|
|
|
|
|
key="member"
|
|
|
|
|
|
|
|
tab={t('管理成员')}
|
|
|
|
|
|
|
|
disabled={roleId === AllPermission}
|
|
|
|
|
|
|
|
>
|
|
|
|
{/* 管理成员 */}
|
|
|
|
{/* 管理成员 */}
|
|
|
|
<div className="text-right mb-2 flex space-x-1">
|
|
|
|
<div className="text-right mb-2 flex space-x-1">
|
|
|
|
<Input
|
|
|
|
<Input
|
|
|
|