feat: permission manage UI for org (#3503)
This commit is contained in:
@@ -20,4 +20,5 @@ type OrgMemberSchemaType = {
|
|||||||
type OrgType = Omit<OrgSchemaType, 'avatar'> & {
|
type OrgType = Omit<OrgSchemaType, 'avatar'> & {
|
||||||
avatar: string;
|
avatar: string;
|
||||||
members: OrgMemberSchemaType[];
|
members: OrgMemberSchemaType[];
|
||||||
|
permission: TeamPermission;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -45,12 +45,12 @@ OrgSchema.virtual('members', {
|
|||||||
localField: '_id',
|
localField: '_id',
|
||||||
foreignField: 'orgId'
|
foreignField: 'orgId'
|
||||||
});
|
});
|
||||||
OrgSchema.virtual('permission', {
|
// OrgSchema.virtual('permission', {
|
||||||
ref: ResourcePermissionCollectionName,
|
// ref: ResourcePermissionCollectionName,
|
||||||
localField: '_id',
|
// localField: '_id',
|
||||||
foreignField: 'orgId',
|
// foreignField: 'orgId',
|
||||||
justOne: true
|
// justOne: true
|
||||||
});
|
// });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
OrgSchema.index({
|
OrgSchema.index({
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import {
|
|||||||
} from '@fastgpt/global/support/permission/user/constant';
|
} from '@fastgpt/global/support/permission/user/constant';
|
||||||
import { TeamPermission } from '@fastgpt/global/support/permission/user/controller';
|
import { TeamPermission } from '@fastgpt/global/support/permission/user/controller';
|
||||||
import { useCreation } from 'ahooks';
|
import { useCreation } from 'ahooks';
|
||||||
|
import { getOrgList } from '@/web/support/user/team/org/api';
|
||||||
|
|
||||||
function PermissionManage() {
|
function PermissionManage() {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -37,6 +38,23 @@ function PermissionManage() {
|
|||||||
(v) => v
|
(v) => v
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const {
|
||||||
|
data: orgs = [],
|
||||||
|
loading: isLoadingOrgs,
|
||||||
|
refresh: refetchOrgs
|
||||||
|
} = useRequest2(getOrgList, {
|
||||||
|
manual: false,
|
||||||
|
refreshDeps: [userInfo?.team?.teamId]
|
||||||
|
});
|
||||||
|
|
||||||
|
const filteredOrgs = useCreation(
|
||||||
|
() =>
|
||||||
|
orgs.filter(
|
||||||
|
(org) => org.path !== '' && org.name.toLowerCase().includes(searchKey.toLowerCase())
|
||||||
|
),
|
||||||
|
[orgs, searchKey]
|
||||||
|
);
|
||||||
|
|
||||||
const { runAsync: refetchClbs, data: clbs = [] } = useRequest2(getTeamClbs, {
|
const { runAsync: refetchClbs, data: clbs = [] } = useRequest2(getTeamClbs, {
|
||||||
manual: false,
|
manual: false,
|
||||||
refreshDeps: [userInfo?.team?.teamId]
|
refreshDeps: [userInfo?.team?.teamId]
|
||||||
@@ -67,15 +85,18 @@ function PermissionManage() {
|
|||||||
refetchGroups();
|
refetchGroups();
|
||||||
refetchMembers();
|
refetchMembers();
|
||||||
refetchClbs();
|
refetchClbs();
|
||||||
|
refetchOrgs();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const { runAsync: onAddPermission, loading: addLoading } = useRequest2(
|
const { runAsync: onAddPermission, loading: addLoading } = useRequest2(
|
||||||
async ({
|
async ({
|
||||||
|
orgId,
|
||||||
groupId,
|
groupId,
|
||||||
memberId,
|
memberId,
|
||||||
per
|
per
|
||||||
}: {
|
}: {
|
||||||
|
orgId?: string;
|
||||||
groupId?: string;
|
groupId?: string;
|
||||||
memberId?: string;
|
memberId?: string;
|
||||||
per: 'write' | 'manage';
|
per: 'write' | 'manage';
|
||||||
@@ -100,6 +121,26 @@ function PermissionManage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (orgId) {
|
||||||
|
const org = orgs.find((org) => String(org._id) === orgId);
|
||||||
|
if (org) {
|
||||||
|
const permission = new TeamPermission({ per: org.permission.value });
|
||||||
|
switch (per) {
|
||||||
|
case 'write':
|
||||||
|
permission.addPer(TeamWritePermissionVal);
|
||||||
|
return onUpdateMemberPermission({
|
||||||
|
orgId: org._id,
|
||||||
|
permission: permission.value
|
||||||
|
});
|
||||||
|
case 'manage':
|
||||||
|
permission.addPer(TeamManagePermissionVal);
|
||||||
|
return onUpdateMemberPermission({
|
||||||
|
orgId: org._id,
|
||||||
|
permission: permission.value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (memberId) {
|
if (memberId) {
|
||||||
const member = filteredMembers?.find((member) => String(member.tmbId) === memberId);
|
const member = filteredMembers?.find((member) => String(member.tmbId) === memberId);
|
||||||
if (member) {
|
if (member) {
|
||||||
@@ -125,10 +166,12 @@ function PermissionManage() {
|
|||||||
|
|
||||||
const { runAsync: onRemovePermission, loading: removeLoading } = useRequest2(
|
const { runAsync: onRemovePermission, loading: removeLoading } = useRequest2(
|
||||||
async ({
|
async ({
|
||||||
|
orgId,
|
||||||
groupId,
|
groupId,
|
||||||
memberId,
|
memberId,
|
||||||
per
|
per
|
||||||
}: {
|
}: {
|
||||||
|
orgId?: string;
|
||||||
groupId?: string;
|
groupId?: string;
|
||||||
memberId?: string;
|
memberId?: string;
|
||||||
per: 'write' | 'manage';
|
per: 'write' | 'manage';
|
||||||
@@ -153,6 +196,26 @@ function PermissionManage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (orgId) {
|
||||||
|
const org = orgs.find((org) => String(org._id) === orgId);
|
||||||
|
if (org) {
|
||||||
|
const permission = new TeamPermission({ per: org.permission.value });
|
||||||
|
switch (per) {
|
||||||
|
case 'write':
|
||||||
|
permission.removePer(TeamWritePermissionVal);
|
||||||
|
return onUpdateMemberPermission({
|
||||||
|
orgId: org._id,
|
||||||
|
permission: permission.value
|
||||||
|
});
|
||||||
|
case 'manage':
|
||||||
|
permission.removePer(TeamManagePermissionVal);
|
||||||
|
return onUpdateMemberPermission({
|
||||||
|
orgId: org._id,
|
||||||
|
permission: permission.value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (memberId) {
|
if (memberId) {
|
||||||
const member = members?.find((member) => String(member.tmbId) === memberId);
|
const member = members?.find((member) => String(member.tmbId) === memberId);
|
||||||
if (member) {
|
if (member) {
|
||||||
@@ -239,9 +302,48 @@ function PermissionManage() {
|
|||||||
</Td>
|
</Td>
|
||||||
</Tr>
|
</Tr>
|
||||||
))}
|
))}
|
||||||
{filteredGroups?.length > 0 && filteredMembers?.length > 0 && (
|
{filteredGroups?.length > 0 && filteredOrgs?.length > 0 && (
|
||||||
<Tr borderBottom={'1px solid'} borderColor={'myGray.300'} />
|
<Tr borderBottom={'1px solid'} borderColor={'myGray.300'} />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{filteredOrgs?.map((org) => (
|
||||||
|
<Tr key={org._id} overflow={'unset'} border="none">
|
||||||
|
<Td border="none">
|
||||||
|
<MemberTag name={org.name} avatar={org.avatar} />
|
||||||
|
</Td>
|
||||||
|
<Td border="none">
|
||||||
|
<Box mx="auto" w="fit-content">
|
||||||
|
<Checkbox
|
||||||
|
isDisabled={!userManage}
|
||||||
|
isChecked={org.permission.hasWritePer}
|
||||||
|
onChange={(e) =>
|
||||||
|
e.target.checked
|
||||||
|
? onAddPermission({ orgId: org._id, per: 'write' })
|
||||||
|
: onRemovePermission({ orgId: org._id, per: 'write' })
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Td>
|
||||||
|
<Td border="none">
|
||||||
|
<Box mx="auto" w="fit-content">
|
||||||
|
<Checkbox
|
||||||
|
isDisabled={!userInfo?.permission.isOwner}
|
||||||
|
isChecked={org.permission.hasManagePer}
|
||||||
|
onChange={(e) =>
|
||||||
|
e.target.checked
|
||||||
|
? onAddPermission({ orgId: org._id, per: 'manage' })
|
||||||
|
: onRemovePermission({ orgId: org._id, per: 'manage' })
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Td>
|
||||||
|
</Tr>
|
||||||
|
))}
|
||||||
|
|
||||||
|
{filteredOrgs?.length > 0 && filteredMembers?.length > 0 && (
|
||||||
|
<Tr borderBottom={'1px solid'} borderColor={'myGray.300'} />
|
||||||
|
)}
|
||||||
|
|
||||||
{filteredMembers?.map((member) => (
|
{filteredMembers?.map((member) => (
|
||||||
<Tr key={member.tmbId} overflow={'unset'} border="none">
|
<Tr key={member.tmbId} overflow={'unset'} border="none">
|
||||||
<Td border="none">
|
<Td border="none">
|
||||||
|
|||||||
Reference in New Issue
Block a user