* feat: org CRUD (#3380) * feat: add org schema * feat: org manage UI * feat: OrgInfoModal * feat: org tree view * feat: org management * fix: init root org * feat: org permission for app * feat: org support for dataset * fix: disable org role control * styles: opt type signatures * fix: remove unused permission * feat: delete org collaborator * perf: Team org ui (#3499) * perf: org ui * perf: org ui * feat: org auth for app & dataset (#3498) * feat: auth org resource permission * feat: org auth support for app & dataset * perf: org permission check (#3500) * i18n (#3501) * name * i18n * feat: support dataset changeOwner (#3483) * feat: support dataset changeOwner * chore: update dataset change owner api * feat: permission manage UI for org (#3503) * perf: password check;perf: image upload check;perf: sso login check (#3509) * perf: password check * perf: image upload check * perf: sso login check * force show update notification modal & fix login page text (#3512) * fix login page English text * update notification modal * perf: notify account (#3515) * perf(plugin): improve searXNG empty result handling and documentation (#3507) * perf(plugin): improve searXNG empty result handling and documentation * 修改了文档和代码部分无搜索的结果的反馈 * refactor: org pathId (#3516) * optimize payment process (#3517) * feat: support wecom sso (#3518) * feat: support wecom sso * chore: remove unused wecom js-sdk dependency * fix qrcode script (#3520) * fix qrcode script * i18n * perf: full text collection and search code;perf: rename function (#3519) * perf: full text collection and search code * perf: rename function * perf: notify modal * remove invalid code * perf: sso login * perf: pay process * 4.8.18 test (#3524) * perf: remove local token * perf: index * perf: file encoding;perf: leave team code;@c121914yu perf: full text search code (#3528) * perf: text encoding * perf: leave team code * perf: full text search code * fix: http status * perf: embedding search and vector avatar * perf: async read file (#3531) * refactor: team permission manager (#3535) * perf: classify org, group and member * refactor: team per manager * fix: missing functions * 4.8.18 test (#3543) * perf: login check * doc * perf: llm model config * perf: team clb config * fix: MemberModal UI (#3553) * fix: adapt MemberModal title and icon * fix: adapt member modal * fix: search input placeholder * fix: add button text * perf: org permission (#3556) * docs:用户答疑的官方文档补充 (#3540) * docs:用户答疑的官方文档补充 * 问题回答的内容修补 * share link random avatar (#3541) * share link random avatar * fix * delete unused code * share page avatar (#3558) * feat: init 4818 * share page avatar * feat: tmp upgrade code (#3559) * feat: tmp upgrade code * fulltext search test * update action * full text tmp code (#3561) * full text tmp code * fix: init * fix: init * remove tmp code * remove tmp code * 4818-alpha * 4.8.18 test (#3562) * full text tmp code * fix: init * upgrade code * account log * account log * perf: dockerfile * upgrade code * chore: update docs app template submission (#3564) --------- Co-authored-by: a.e. <49438478+I-Info@users.noreply.github.com> Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: heheer <heheer@sealos.io> Co-authored-by: Jiangween <145003935+Jiangween@users.noreply.github.com>
231 lines
6.4 KiB
TypeScript
231 lines
6.4 KiB
TypeScript
import { useDisclosure } from '@chakra-ui/react';
|
|
import type {
|
|
CollaboratorItemType,
|
|
UpdateClbPermissionProps
|
|
} from '@fastgpt/global/support/permission/collaborator';
|
|
import { PermissionList } from '@fastgpt/global/support/permission/constant';
|
|
import { Permission } from '@fastgpt/global/support/permission/controller';
|
|
import type {
|
|
PermissionListType,
|
|
PermissionValueType
|
|
} from '@fastgpt/global/support/permission/type';
|
|
import { type ReactNode, useCallback } from 'react';
|
|
import { createContext } from 'use-context-selector';
|
|
import dynamic from 'next/dynamic';
|
|
|
|
import MemberListCard, { type MemberListCardProps } from './MemberListCard';
|
|
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
|
|
import { useSystemStore } from '@/web/common/system/useSystemStore';
|
|
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
|
|
import { useI18n } from '@/web/context/I18n';
|
|
import type { RequireOnlyOne } from '@fastgpt/global/common/type/utils';
|
|
|
|
const MemberModal = dynamic(() => import('./MemberModal'));
|
|
const ManageModal = dynamic(() => import('./ManageModal'));
|
|
|
|
export type MemberManagerInputPropsType = {
|
|
permission: Permission;
|
|
onGetCollaboratorList: () => Promise<CollaboratorItemType[]>;
|
|
permissionList?: PermissionListType;
|
|
onUpdateCollaborators: (props: UpdateClbPermissionProps) => Promise<any>;
|
|
onDelOneCollaborator: (
|
|
props: RequireOnlyOne<{ tmbId: string; groupId: string; orgId: string }>
|
|
) => Promise<any>;
|
|
refreshDeps?: any[];
|
|
};
|
|
|
|
export type MemberManagerPropsType = MemberManagerInputPropsType & {
|
|
collaboratorList: CollaboratorItemType[];
|
|
refetchCollaboratorList: () => void;
|
|
isFetchingCollaborator: boolean;
|
|
getPerLabelList: (per: PermissionValueType) => string[];
|
|
};
|
|
export type ChildrenProps = {
|
|
onOpenAddMember: () => void;
|
|
onOpenManageModal: () => void;
|
|
MemberListCard: (props: MemberListCardProps) => JSX.Element;
|
|
};
|
|
|
|
type CollaboratorContextType = MemberManagerPropsType & {};
|
|
|
|
export const CollaboratorContext = createContext<CollaboratorContextType>({
|
|
collaboratorList: [],
|
|
permissionList: PermissionList,
|
|
onUpdateCollaborators: () => {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
onDelOneCollaborator: () => {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
getPerLabelList: (): string[] => {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
refetchCollaboratorList: (): void => {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
onGetCollaboratorList: (): Promise<CollaboratorItemType[]> => {
|
|
throw new Error('Function not implemented.');
|
|
},
|
|
isFetchingCollaborator: false,
|
|
permission: new Permission()
|
|
});
|
|
|
|
const CollaboratorContextProvider = ({
|
|
permission,
|
|
onGetCollaboratorList,
|
|
permissionList,
|
|
onUpdateCollaborators,
|
|
onDelOneCollaborator,
|
|
children,
|
|
refetchResource,
|
|
refreshDeps = [],
|
|
isInheritPermission,
|
|
hasParent,
|
|
addPermissionOnly
|
|
}: MemberManagerInputPropsType & {
|
|
children: (props: ChildrenProps) => ReactNode;
|
|
refetchResource?: () => void;
|
|
isInheritPermission?: boolean;
|
|
hasParent?: boolean;
|
|
addPermissionOnly?: boolean;
|
|
}) => {
|
|
const onUpdateCollaboratorsThen = async (props: UpdateClbPermissionProps) => {
|
|
await onUpdateCollaborators(props);
|
|
refetchCollaboratorList();
|
|
};
|
|
const onDelOneCollaboratorThen = async (
|
|
props: RequireOnlyOne<{ tmbId: string; groupId: string; orgId: string }>
|
|
) => {
|
|
await onDelOneCollaborator(props);
|
|
refetchCollaboratorList();
|
|
};
|
|
|
|
const { feConfigs } = useSystemStore();
|
|
const { commonT } = useI18n();
|
|
|
|
const {
|
|
data: collaboratorList = [],
|
|
runAsync: refetchCollaboratorList,
|
|
loading: isFetchingCollaborator
|
|
} = useRequest2(
|
|
async () => {
|
|
if (feConfigs.isPlus) {
|
|
return onGetCollaboratorList();
|
|
}
|
|
return [];
|
|
},
|
|
{
|
|
manual: false,
|
|
refreshDeps: refreshDeps
|
|
}
|
|
);
|
|
|
|
const getPerLabelList = useCallback(
|
|
(per: PermissionValueType) => {
|
|
if (!permissionList) return [];
|
|
|
|
const Per = new Permission({ per });
|
|
const labels: string[] = [];
|
|
|
|
if (Per.hasManagePer) {
|
|
labels.push(permissionList['manage'].name);
|
|
} else if (Per.hasWritePer) {
|
|
labels.push(permissionList['write'].name);
|
|
} else if (Per.hasReadPer) {
|
|
labels.push(permissionList['read'].name);
|
|
}
|
|
|
|
Object.values(permissionList).forEach((item) => {
|
|
if (item.checkBoxType === 'multiple') {
|
|
if (Per.checkPer(item.value)) {
|
|
labels.push(item.name);
|
|
}
|
|
}
|
|
});
|
|
|
|
return labels;
|
|
},
|
|
[permissionList]
|
|
);
|
|
|
|
const { ConfirmModal, openConfirm } = useConfirm({});
|
|
const {
|
|
isOpen: isOpenAddMember,
|
|
onOpen: onOpenAddMember,
|
|
onClose: onCloseAddMember
|
|
} = useDisclosure();
|
|
const {
|
|
isOpen: isOpenManageModal,
|
|
onOpen: onOpenManageModal,
|
|
onClose: onCloseManageModal
|
|
} = useDisclosure();
|
|
|
|
const contextValue = {
|
|
permission,
|
|
onGetCollaboratorList,
|
|
collaboratorList,
|
|
refetchCollaboratorList,
|
|
isFetchingCollaborator,
|
|
permissionList,
|
|
onUpdateCollaborators: onUpdateCollaboratorsThen,
|
|
onDelOneCollaborator: onDelOneCollaboratorThen,
|
|
getPerLabelList
|
|
};
|
|
|
|
const onOpenAddMemberModal = () => {
|
|
if (isInheritPermission && hasParent) {
|
|
openConfirm(
|
|
() => {
|
|
onOpenAddMember();
|
|
},
|
|
undefined,
|
|
commonT('permission.Remove InheritPermission Confirm')
|
|
)();
|
|
} else {
|
|
onOpenAddMember();
|
|
}
|
|
};
|
|
const onOpenManageModalModal = () => {
|
|
if (isInheritPermission && hasParent) {
|
|
openConfirm(
|
|
() => {
|
|
onOpenManageModal();
|
|
},
|
|
undefined,
|
|
commonT('permission.Remove InheritPermission Confirm')
|
|
)();
|
|
} else {
|
|
onOpenManageModal();
|
|
}
|
|
};
|
|
return (
|
|
<CollaboratorContext.Provider value={contextValue}>
|
|
{children({
|
|
onOpenAddMember: onOpenAddMemberModal,
|
|
onOpenManageModal: onOpenManageModalModal,
|
|
MemberListCard
|
|
})}
|
|
{isOpenAddMember && (
|
|
<MemberModal
|
|
onClose={() => {
|
|
onCloseAddMember();
|
|
refetchResource?.();
|
|
}}
|
|
addPermissionOnly={addPermissionOnly}
|
|
/>
|
|
)}
|
|
{isOpenManageModal && (
|
|
<ManageModal
|
|
onClose={() => {
|
|
onCloseManageModal();
|
|
refetchResource?.();
|
|
}}
|
|
/>
|
|
)}
|
|
<ConfirmModal />
|
|
</CollaboratorContext.Provider>
|
|
);
|
|
};
|
|
|
|
export default CollaboratorContextProvider;
|