feat: 所有人身份组的管理

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

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

@ -12,7 +12,8 @@ import type { GroupPanel } from 'tailchat-shared';
import { Avatar } from '../Avatar';
import { closeModal, ModalWrapper } from '../Modal';
import { Slides, SlidesRef } from '../Slides';
import { useHistory, useLocation } from 'react-router';
import { useHistory } from 'react-router';
import { applyDefaultFallbackGroupPermission } from '@/utils/role-helper';
const panelTemplate: {
key: string;
@ -92,8 +93,12 @@ export const ModalCreateGroup: React.FC = React.memo(() => {
const data = await createGroup(name, panels);
dispatch(groupActions.appendGroups([data]));
history.push(`/main/group/${data._id}`); // 创建完成后跳转到新建的群组
// 应用默认权限
await applyDefaultFallbackGroupPermission(String(data._id));
closeModal();
}, [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 { PillTabPane, PillTabs } from '@/components/PillTabs';
import { UserListItem } from '@/components/UserListItem';
import { AllPermission, permissionList } from '@/utils/role-helper';
import { Button, Input } from 'antd';
import React, { useCallback, useMemo, useState } from 'react';
import { Icon } from 'tailchat-design';
import { t, useGroupInfo, useSearch, useUserInfoList } from 'tailchat-shared';
import { permissionList } from './const';
import { PermissionItem } from './PermissionItem';
import { RoleItem } from './RoleItem';
import { useModifyPermission } from './useModifyPermission';
@ -21,7 +21,9 @@ interface GroupPermissionProps {
}
export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
const { groupId } = props;
const [roleId, setRoleId] = useState('');
const [roleId, setRoleId] = useState<typeof AllPermission | string>(
AllPermission
);
const groupInfo = useGroupInfo(groupId);
const roles = groupInfo?.roles ?? [];
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, roleId]
);
const currentRolePermissions = useMemo(
() => currentRoleInfo?.permissions ?? [],
[currentRoleInfo]
);
const currentRolePermissions: string[] = useMemo(() => {
if (roleId === AllPermission) {
return groupInfo?.fallbackPermissions ?? [];
}
return currentRoleInfo?.permissions ?? [];
}, [roleId, currentRoleInfo, groupInfo]);
const {
loading,
@ -71,7 +76,10 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
<div className="flex h-full">
<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('所有人')}
</RoleItem>
@ -92,7 +100,11 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
<div className="flex-1 overflow-y-auto">
<PillTabs defaultActiveKey="permission">
<PillTabPane key="summary" tab={t('概述')} disabled={!roleId}>
<PillTabPane
key="summary"
tab={t('概述')}
disabled={roleId === AllPermission}
>
{/* 权限概述 */}
{currentRoleInfo && (
<div className="px-2">
@ -131,7 +143,11 @@ export const GroupRole: React.FC<GroupPermissionProps> = React.memo((props) => {
/>
))}
</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">
<Input

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