feat: 所有人身份组的管理

pull/49/head
moonrailgun 3 years ago
parent 9631081b65
commit ef209d6b5f

@ -41,6 +41,7 @@ export interface GroupInfo {
members: GroupMember[]; members: GroupMember[];
panels: GroupPanel[]; panels: GroupPanel[];
roles: GroupRole[]; roles: GroupRole[];
fallbackPermissions: string[];
pinnedPanelId?: string; // 被钉选的面板Id pinnedPanelId?: string; // 被钉选的面板Id
} }
@ -99,7 +100,12 @@ export async function getGroupBasicInfo(
* @param fieldName * @param fieldName
* @param fieldValue * @param fieldValue
*/ */
type AllowedModifyField = 'name' | 'avatar' | 'panels' | 'roles'; type AllowedModifyField =
| 'name'
| 'avatar'
| 'panels'
| 'roles'
| 'fallbackPermissions';
export async function modifyGroupField( export async function modifyGroupField(
groupId: string, groupId: string,
fieldName: AllowedModifyField, fieldName: AllowedModifyField,

@ -12,7 +12,8 @@ import type { GroupPanel } from 'tailchat-shared';
import { Avatar } from '../Avatar'; import { Avatar } from '../Avatar';
import { closeModal, ModalWrapper } from '../Modal'; import { closeModal, ModalWrapper } from '../Modal';
import { Slides, SlidesRef } from '../Slides'; import { Slides, SlidesRef } from '../Slides';
import { useHistory, useLocation } from 'react-router'; import { useHistory } from 'react-router';
import { applyDefaultFallbackGroupPermission } from '@/utils/role-helper';
const panelTemplate: { const panelTemplate: {
key: string; key: string;
@ -92,8 +93,12 @@ export const ModalCreateGroup: React.FC = React.memo(() => {
const data = await createGroup(name, panels); const data = await createGroup(name, panels);
dispatch(groupActions.appendGroups([data])); dispatch(groupActions.appendGroups([data]));
history.push(`/main/group/${data._id}`); // 创建完成后跳转到新建的群组 history.push(`/main/group/${data._id}`); // 创建完成后跳转到新建的群组
// 应用默认权限
await applyDefaultFallbackGroupPermission(String(data._id));
closeModal(); closeModal();
}, [name, panels, location]); }, [name, panels, location]);

@ -1,10 +0,0 @@
import { t } from 'tailchat-shared';
export const permissionList = [
{
key: 'core.message',
title: t('发送消息'),
desc: t('允许成员在文字频道发送消息'),
default: true,
},
];

@ -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

@ -1,25 +1,45 @@
import { AllPermission, getDefaultPermissionList } from '@/utils/role-helper';
import { model, t, useAsyncRequest } from 'tailchat-shared'; import { model, t, useAsyncRequest } from 'tailchat-shared';
import { permissionList } from './const';
export function useRoleActions(groupId: string, roleId: string) { export function useRoleActions(
groupId: string,
roleId: typeof AllPermission | string
) {
const [{ loading: loading1 }, handleCreateRole] = const [{ loading: loading1 }, handleCreateRole] =
useAsyncRequest(async () => { useAsyncRequest(async () => {
await model.group.createGroupRole( await model.group.createGroupRole(
groupId, groupId,
t('新身份组'), t('新身份组'),
permissionList.filter((p) => p.default).map((p) => p.key) getDefaultPermissionList()
); );
}, [groupId]); }, [groupId]);
const [{ loading: loading2 }, handleSavePermission] = useAsyncRequest( const [{ loading: loading2 }, handleSavePermission] = useAsyncRequest(
async (permissions: string[]) => { async (permissions: string[]) => {
await model.group.updateGroupRolePermission(groupId, roleId, permissions); if (roleId === AllPermission) {
// 所有人权限
await model.group.modifyGroupField(
groupId,
'fallbackPermissions',
permissions
);
} else {
// 身份组权限
await model.group.updateGroupRolePermission(
groupId,
roleId,
permissions
);
}
}, },
[groupId, roleId] [groupId, roleId]
); );
const [{ loading: loading3 }, handleChangeRoleName] = useAsyncRequest( const [{ loading: loading3 }, handleChangeRoleName] = useAsyncRequest(
async (newRoleName: string) => { async (newRoleName: string) => {
if (roleId === AllPermission) {
throw new Error(t('无法修改所有人权限组的显示名称'));
}
await model.group.updateGroupRoleName(groupId, roleId, newRoleName); await model.group.updateGroupRoleName(groupId, roleId, newRoleName);
}, },
[groupId, roleId] [groupId, roleId]

@ -0,0 +1,31 @@
import { model, t } from 'tailchat-shared';
/**
*
*
*/
export const AllPermission = Symbol('AllPermission');
export const permissionList = [
{
key: 'core.message',
title: t('发送消息'),
desc: t('允许成员在文字频道发送消息'),
default: true,
},
];
export function getDefaultPermissionList(): string[] {
return permissionList.filter((p) => p.default).map((p) => p.key);
}
/**
*
*/
export async function applyDefaultFallbackGroupPermission(groupId: string) {
await model.group.modifyGroupField(
groupId,
'fallbackPermissions',
getDefaultPermissionList()
);
}
Loading…
Cancel
Save