feat: add group panel permission filter in permission

pull/146/merge
moonrailgun 2 years ago
parent 8b89b265c1
commit 5f9140db9d

@ -1,3 +1,4 @@
import { GroupPanelType } from 'tailchat-types';
import { model, t } from '..'; import { model, t } from '..';
/** /**
@ -28,6 +29,15 @@ export interface PermissionItemType {
* *
*/ */
required?: string[]; required?: string[];
/**
*
* ()
*
*
*
* @default undefined
*/
panel?: boolean | (string | GroupPanelType)[];
} }
export const PERMISSION = { export const PERMISSION = {
@ -55,6 +65,7 @@ export const getPermissionList = (): PermissionItemType[] => [
title: t('发送消息'), title: t('发送消息'),
desc: t('允许成员在文字频道发送消息'), desc: t('允许成员在文字频道发送消息'),
default: true, default: true,
panel: [GroupPanelType.TEXT],
}, },
{ {
key: PERMISSION.core.invite, key: PERMISSION.core.invite,

@ -1,11 +1,21 @@
import { Col, Divider, Row, Switch } from 'antd'; import { Col, Divider, Row, Switch } from 'antd';
import React from 'react'; import React from 'react';
import { getPermissionList, t, useEvent } from 'tailchat-shared'; import {
getPermissionList,
GroupPanelType,
PermissionItemType,
t,
useEvent,
} from 'tailchat-shared';
import _uniq from 'lodash/uniq'; import _uniq from 'lodash/uniq';
import _without from 'lodash/without'; import _without from 'lodash/without';
import { pluginPermission } from '@/plugin/common'; import { pluginPermission } from '@/plugin/common';
interface PermissionListProps { interface PermissionListProps {
/**
*
*/
panelType?: string | GroupPanelType.TEXT | GroupPanelType.GROUP;
value: string[]; value: string[];
onChange: (value: string[]) => void; onChange: (value: string[]) => void;
} }
@ -21,10 +31,46 @@ export const PermissionList: React.FC<PermissionListProps> = React.memo(
} }
); );
const panelPermissionFilterFn = useEvent(
(permissionInfo: PermissionItemType) => {
if (typeof props.panelType === 'undefined') {
// 如果不传则无限制
return true;
}
if (!permissionInfo.panel) {
// 没有定义面板信息,则该权限不适用于面板策略
return false;
}
if (permissionInfo.panel === true) {
return true;
}
if (Array.isArray(permissionInfo.panel)) {
return permissionInfo.panel.includes(props.panelType);
}
}
);
const builtinPermissionList = getPermissionList().filter(
panelPermissionFilterFn
);
const pluginPermissionList = pluginPermission.filter(
panelPermissionFilterFn
);
if (
builtinPermissionList.length === 0 &&
pluginPermissionList.length === 0
) {
return <div className="text-center">{t('暂无可用的权限项')}</div>;
}
return ( return (
<div> <div>
{/* 权限详情 */} {/* 权限详情 */}
{getPermissionList().map((p) => ( {builtinPermissionList.map((p) => (
<PermissionItem <PermissionItem
key={p.key} key={p.key}
title={p.title} title={p.title}
@ -39,7 +85,7 @@ export const PermissionList: React.FC<PermissionListProps> = React.memo(
/> />
))} ))}
{pluginPermission.length > 0 && ( {pluginPermissionList.length > 0 && (
<> <>
<Divider>{t('以下为插件权限')}</Divider> <Divider>{t('以下为插件权限')}</Divider>

@ -1,16 +1,17 @@
import { PermissionList } from '@/components/PermissionList'; import { PermissionList } from '@/components/PermissionList';
import { Button } from 'antd'; import { Button } from 'antd';
import clsx from 'clsx'; import clsx from 'clsx';
import React, { PropsWithChildren, useState } from 'react'; import React, { PropsWithChildren, useMemo, useState } from 'react';
import { import {
ALL_PERMISSION, ALL_PERMISSION,
getDefaultPermissionList, getDefaultPermissionList,
GroupPanelType,
t, t,
useAppSelector, useAppSelector,
useEvent, useEvent,
useLazyValue, useLazyValue,
} from 'tailchat-shared'; } from 'tailchat-shared';
import _isEqual from 'lodash/isEqual'; import { LoadingSpinner } from '@/components/LoadingSpinner';
interface AdvanceGroupPanelPermissionProps { interface AdvanceGroupPanelPermissionProps {
height?: number; height?: number;
@ -32,10 +33,15 @@ export const AdvanceGroupPanelPermission: React.FC<AdvanceGroupPanelPermissionPr
return groupInfo.roles; return groupInfo.roles;
}); });
const permissionMap: Record<string | typeof ALL_PERMISSION, string[]> = const panelInfo = useAppSelector((state) => {
useAppSelector((state) => {
const groupInfo = state.group.groups[props.groupId]; const groupInfo = state.group.groups[props.groupId];
const panelInfo = groupInfo.panels.find((p) => p.id === props.panelId); const panelInfo = groupInfo.panels.find((p) => p.id === props.panelId);
return panelInfo;
});
const permissionMap: Record<string | typeof ALL_PERMISSION, string[]> =
useMemo(() => {
if (!panelInfo) { if (!panelInfo) {
return { [ALL_PERMISSION]: getDefaultPermissionList() }; return { [ALL_PERMISSION]: getDefaultPermissionList() };
} else { } else {
@ -45,7 +51,7 @@ export const AdvanceGroupPanelPermission: React.FC<AdvanceGroupPanelPermissionPr
...panelInfo.permissionMap, ...panelInfo.permissionMap,
}; };
} }
}, _isEqual); }, [panelInfo]);
const [editPermissionMap, setEditPermissionMap] = useLazyValue( const [editPermissionMap, setEditPermissionMap] = useLazyValue(
permissionMap, permissionMap,
@ -64,6 +70,10 @@ export const AdvanceGroupPanelPermission: React.FC<AdvanceGroupPanelPermissionPr
props.onChange(undefined); props.onChange(undefined);
}); });
if (!panelInfo) {
return <LoadingSpinner />;
}
return ( return (
<div className="flex" style={{ width: 540 }}> <div className="flex" style={{ width: 540 }}>
<div> <div>
@ -88,6 +98,11 @@ export const AdvanceGroupPanelPermission: React.FC<AdvanceGroupPanelPermissionPr
<Button onClick={handleSyncWithGroup}>{t('与群组配置同步')}</Button> <Button onClick={handleSyncWithGroup}>{t('与群组配置同步')}</Button>
</div> </div>
<PermissionList <PermissionList
panelType={
panelInfo.type === GroupPanelType.PLUGIN
? panelInfo.pluginPanelName
: panelInfo.type
}
value={editPermissionMap[selectedRoleId] ?? []} value={editPermissionMap[selectedRoleId] ?? []}
onChange={handleUpdatePermissionMap} onChange={handleUpdatePermissionMap}
/> />

Loading…
Cancel
Save