Context extract support value type (#1620)

* perf: chat box components

* perf: chatbox context

* feat: extract support value type

* workflow performance

* update doc

* feat: error response

* feat: error response

* oauth sort

* perf: logo

* fix: update laf account

* perf: team permission api

* update type
This commit is contained in:
Archer
2024-05-28 23:33:05 +08:00
committed by GitHub
parent 8ba8488086
commit 1e48922bc9
48 changed files with 232 additions and 178 deletions

View File

@@ -3,6 +3,7 @@
"App": "App",
"Code editor": "Code edit",
"Export": "Export",
"Field name": "Name",
"Folder": "Folder",
"Is open": "Opened",
"Login": "Login",

View File

@@ -7,6 +7,7 @@
},
"response": {
"Custom inputs": "Custom inputs",
"Custom outputs": "Custom outputs"
"Custom outputs": "Custom outputs",
"Error": "Error"
}
}

View File

@@ -3,6 +3,7 @@
"App": "应用",
"Code editor": "代码编辑",
"Export": "导出",
"Field name": "字段名",
"Folder": "文件夹",
"Is open": "是否开启",
"Login": "登录",
@@ -476,7 +477,7 @@
"context total length": "上下文总长度",
"module cq": "问题分类列表",
"module cq result": "分类结果",
"module extract description": "提取要求描述",
"module extract description": "提取背景描述",
"module extract result": "提取结果",
"module historyPreview": "完整记录",
"module http body": "请求体",
@@ -584,8 +585,7 @@
"success": "开始同步"
}
},
"training": {
}
"training": {}
},
"data": {
"Auxiliary Data": "辅助数据",

View File

@@ -7,6 +7,7 @@
},
"response": {
"Custom inputs": "自定义输入",
"Custom outputs": "自定义输出"
"Custom outputs": "自定义输出",
"Error": "错误信息"
}
}

View File

@@ -7,7 +7,6 @@ import MyTooltip from '../../MyTooltip';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
import { compressImgFileAndUpload } from '@/web/common/file/controller';
import { customAlphabet } from 'nanoid';
import { ChatFileTypeEnum } from '@fastgpt/global/core/chat/constants';
import { addDays } from 'date-fns';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
@@ -15,9 +14,10 @@ import { MongoImageTypeEnum } from '@fastgpt/global/common/file/image/constants'
import { ChatBoxInputFormType, ChatBoxInputType, UserInputFileItemType } from '../type';
import { textareaMinH } from '../constants';
import { UseFormReturn, useFieldArray } from 'react-hook-form';
import { useChatProviderStore } from '../Provider';
import { ChatBoxContext } from '../Provider';
import dynamic from 'next/dynamic';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 6);
import { useContextSelector } from 'use-context-selector';
import { getNanoid } from '@fastgpt/global/common/string/tools';
const InputGuideBox = dynamic(() => import('./InputGuideBox'));
@@ -60,7 +60,7 @@ const ChatInput = ({
whisperConfig,
autoTTSResponse,
chatInputGuide
} = useChatProviderStore();
} = useContextSelector(ChatBoxContext, (v) => v);
const { isPc, whisperModel } = useSystemStore();
const canvasRef = useRef<HTMLCanvasElement>(null);
const { t } = useTranslation();
@@ -119,7 +119,7 @@ const ChatInput = ({
reader.readAsDataURL(file);
reader.onload = () => {
const item = {
id: nanoid(),
id: getNanoid(6),
rawFile: file,
type: ChatFileTypeEnum.image,
name: file.name,
@@ -132,7 +132,7 @@ const ChatInput = ({
};
} else {
resolve({
id: nanoid(),
id: getNanoid(6),
rawFile: file,
type: ChatFileTypeEnum.file,
name: file.name,

View File

@@ -7,7 +7,8 @@ import { queryChatInputGuideList } from '@/web/core/chat/inputGuide/api';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useTranslation } from 'next-i18next';
import HighlightText from '@fastgpt/web/components/common/String/HighlightText';
import { useChatProviderStore } from '../Provider';
import { ChatBoxContext } from '../Provider';
import { useContextSelector } from 'use-context-selector';
export default function InputGuideBox({
appId,
@@ -22,7 +23,7 @@ export default function InputGuideBox({
}) {
const { t } = useTranslation();
const { chatT } = useI18n();
const { chatInputGuide } = useChatProviderStore();
const chatInputGuide = useContextSelector(ChatBoxContext, (v) => v.chatInputGuide);
const { data = [] } = useRequest2(
async () => {

View File

@@ -1,16 +0,0 @@
import React, { useState } from 'react';
const MarkModal = () => {
const [adminMarkData, setAdminMarkData] = useState<{
chatItemId: string;
dataId?: string;
datasetId?: string;
collectionId?: string;
q: string;
a: string;
}>();
return <div>MarkModal</div>;
};
export default MarkModal;

View File

@@ -1,7 +1,6 @@
import React, { useContext, createContext, useState, useMemo, useEffect, useCallback } from 'react';
import React, { useState, useMemo } from 'react';
import { useAudioPlay } from '@/web/common/utils/voice';
import { OutLinkChatAuthProps } from '@fastgpt/global/support/permission/chat';
import { StoreNodeItemType } from '@fastgpt/global/core/workflow/type/index.d';
import {
AppChatConfigType,
AppTTSConfigType,
@@ -15,6 +14,7 @@ import {
defaultTTSConfig,
defaultWhisperConfig
} from '@fastgpt/global/core/app/constants';
import { createContext } from 'use-context-selector';
type useChatStoreType = OutLinkChatAuthProps & {
welcomeText: string;
@@ -46,7 +46,7 @@ type useChatStoreType = OutLinkChatAuthProps & {
isChatting: boolean;
chatInputGuide: ChatInputGuideConfigType;
};
const StateContext = createContext<useChatStoreType>({
export const ChatBoxContext = createContext<useChatStoreType>({
welcomeText: '',
variableList: [],
questionGuide: false,
@@ -109,8 +109,6 @@ export type ChatProviderProps = OutLinkChatAuthProps & {
children: React.ReactNode;
};
export const useChatProviderStore = () => useContext(StateContext);
const Provider = ({
shareId,
outLinkUid,
@@ -186,7 +184,7 @@ const Provider = ({
chatInputGuide
};
return <StateContext.Provider value={value}>{children}</StateContext.Provider>;
return <ChatBoxContext.Provider value={value}>{children}</ChatBoxContext.Provider>;
};
export default React.memo(Provider);

View File

@@ -7,7 +7,8 @@ import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { formatChatValue2InputType } from '../utils';
import { ChatRoleEnum } from '@fastgpt/global/core/chat/constants';
import { useChatProviderStore } from '../Provider';
import { ChatBoxContext } from '../Provider';
import { useContextSelector } from 'use-context-selector';
export type ChatControllerProps = {
isLastChild: boolean;
@@ -45,7 +46,7 @@ const ChatController = ({
cancelAudio,
audioPlayingChatId,
setAudioPlayingChatId
} = useChatProviderStore();
} = useContextSelector(ChatBoxContext, (v) => v);
const controlIconStyle = {
w: '14px',
cursor: 'pointer',

View File

@@ -25,8 +25,9 @@ import {
ChatStatusEnum
} from '@fastgpt/global/core/chat/constants';
import FilesBlock from './FilesBox';
import { useChatProviderStore } from '../Provider';
import { ChatBoxContext } from '../Provider';
import Avatar from '@/components/Avatar';
import { useContextSelector } from 'use-context-selector';
const colorMap = {
[ChatStatusEnum.loading]: {
@@ -78,7 +79,7 @@ const ChatItem = ({
bg: 'myGray.50'
};
const { isChatting } = useChatProviderStore();
const isChatting = useContextSelector(ChatBoxContext, (v) => v.isChatting);
const { chat } = chatControllerProps;
const ContentCard = useMemo(() => {

View File

@@ -4,8 +4,8 @@ import { ModalBody, Box, useTheme } from '@chakra-ui/react';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import QuoteItem from '../core/dataset/QuoteItem';
import RawSourceBox from '../core/dataset/RawSourceBox';
import QuoteItem from '../../core/dataset/QuoteItem';
import RawSourceBox from '../../core/dataset/RawSourceBox';
const QuoteModal = ({
rawSearch = [],

View File

@@ -7,7 +7,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type';
import dynamic from 'next/dynamic';
import MyTag from '@fastgpt/web/components/common/Tag/index';
import MyTooltip from '../MyTooltip';
import MyTooltip from '../../MyTooltip';
import { FlowNodeTypeEnum } from '@fastgpt/global/core/workflow/node/constant';
import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils';
import ChatBoxDivider from '@/components/core/chat/Divider';

View File

@@ -1,7 +1,7 @@
import React, { useState } from 'react';
import { ModalBody, useTheme, ModalFooter, Button, Box, Card, Flex, Grid } from '@chakra-ui/react';
import { useTranslation } from 'next-i18next';
import Avatar from '../Avatar';
import Avatar from '@/components/Avatar';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import DatasetSelectModal, { useDatasetSelect } from '@/components/core/dataset/SelectModal';

View File

@@ -1,14 +1,14 @@
import React, { useCallback, useMemo, useState } from 'react';
import React, { useMemo, useState } from 'react';
import { Box, useTheme, Flex, Image, BoxProps } from '@chakra-ui/react';
import type { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d';
import { useTranslation } from 'next-i18next';
import { moduleTemplatesFlat } from '@fastgpt/global/core/workflow/template/constants';
import Tabs from '../Tabs';
import Tabs from '../../Tabs';
import MyModal from '@fastgpt/web/components/common/MyModal';
import MyTooltip from '../MyTooltip';
import MyTooltip from '../../MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import Markdown from '../Markdown';
import Markdown from '../../Markdown';
import { QuoteList } from './QuoteModal';
import { DatasetSearchModeMap } from '@fastgpt/global/core/dataset/constants';
import { formatNumber } from '@fastgpt/global/common/math/tools';
@@ -185,6 +185,7 @@ export const ResponseBox = React.memo(function ResponseBox({
label={t('core.chat.response.context total length')}
value={activeModule?.contextTotalLen}
/>
<Row label={workflowT('response.Error')} value={activeModule?.error} />
</>
{/* ai chat */}

View File

@@ -15,14 +15,12 @@ import type {
ChatSiteItemType,
UserChatItemValueItemType
} from '@fastgpt/global/core/chat/type.d';
import type { ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d';
import { useToast } from '@fastgpt/web/hooks/useToast';
import { getErrText } from '@fastgpt/global/common/error/utils';
import { Box, Flex, Checkbox } from '@chakra-ui/react';
import { EventNameEnum, eventBus } from '@/web/common/utils/eventbus';
import { chats2GPTMessages } from '@fastgpt/global/core/chat/adapt';
import { VariableInputEnum } from '@fastgpt/global/core/workflow/constants';
import { DispatchNodeResponseKeyEnum } from '@fastgpt/global/core/workflow/runtime/constants';
import { useForm } from 'react-hook-form';
import { useRouter } from 'next/router';
import { useSystemStore } from '@/web/common/system/useSystemStore';
@@ -32,7 +30,7 @@ import {
updateChatAdminFeedback,
updateChatUserFeedback
} from '@/web/core/chat/api';
import type { AdminMarkType } from './SelectMarkCollection';
import type { AdminMarkType } from './components/SelectMarkCollection';
import MyTooltip from '../MyTooltip';
@@ -52,7 +50,7 @@ import { ChatItemValueTypeEnum, ChatRoleEnum } from '@fastgpt/global/core/chat/c
import { formatChatValue2InputType } from './utils';
import { textareaMinH } from './constants';
import { SseResponseEventEnum } from '@fastgpt/global/core/workflow/runtime/constants';
import ChatProvider, { useChatProviderStore } from './Provider';
import ChatProvider, { ChatBoxContext } from './Provider';
import ChatItem from './components/ChatItem';
@@ -60,11 +58,12 @@ import dynamic from 'next/dynamic';
import { useCreation } from 'ahooks';
import { AppChatConfigType } from '@fastgpt/global/core/app/type';
import type { StreamResponseType } from '@/web/common/api/fetch';
import { useContextSelector } from 'use-context-selector';
const ResponseTags = dynamic(() => import('./ResponseTags'));
const FeedbackModal = dynamic(() => import('./FeedbackModal'));
const ReadFeedbackModal = dynamic(() => import('./ReadFeedbackModal'));
const SelectMarkCollection = dynamic(() => import('./SelectMarkCollection'));
const ResponseTags = dynamic(() => import('./components/ResponseTags'));
const FeedbackModal = dynamic(() => import('./components/FeedbackModal'));
const ReadFeedbackModal = dynamic(() => import('./components/ReadFeedbackModal'));
const SelectMarkCollection = dynamic(() => import('./components/SelectMarkCollection'));
const Empty = dynamic(() => import('./components/Empty'));
const WelcomeBox = dynamic(() => import('./components/WelcomeBox'));
const VariableInput = dynamic(() => import('./components/VariableInput'));
@@ -158,7 +157,7 @@ const ChatBox = (
chatHistories,
setChatHistories,
isChatting
} = useChatProviderStore();
} = useContextSelector(ChatBoxContext, (v) => v);
// compute variable input is finish.
const chatForm = useForm<ChatBoxInputFormType>({

View File

@@ -102,7 +102,13 @@ const Navbar = ({ unread }: { unread: number }) => {
cursor={'pointer'}
onClick={() => router.push('/account')}
>
<Avatar w={'36px'} h={'36px'} src={userInfo?.avatar} fallbackSrc={HUMAN_ICON} />
<Avatar
w={'36px'}
h={'36px'}
src={userInfo?.avatar}
fallbackSrc={HUMAN_ICON}
borderRadius={'50%'}
/>
</Box>
{/* 导航列表 */}
<Box flex={1}>

View File

@@ -29,13 +29,13 @@ const NodeCode = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
content: workflowT('code.Reset template confirm')
});
const CustomComponent = useMemo(
() => ({
const CustomComponent = useMemo(() => {
return {
[NodeInputKeyEnum.code]: (item: FlowNodeInputItemType) => {
return (
<Box>
<Flex mb={1} alignItems={'flex-end'}>
<Box flex={'1'}>{workflowT('Code')}</Box>
<Box flex={'1'}>Javascript{workflowT('Code')}</Box>
<Box
cursor={'pointer'}
color={'primary.500'}
@@ -74,9 +74,8 @@ const NodeCode = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
</Box>
);
}
}),
[nodeId, onChangeNode, openConfirm, workflowT]
);
};
}, [nodeId, onChangeNode, openConfirm, workflowT]);
return (
<NodeCard minW={'400px'} selected={selected} {...data}>

View File

@@ -1,4 +1,4 @@
import React, { useMemo, useState } from 'react';
import React from 'react';
import {
Box,
Button,
@@ -15,8 +15,11 @@ import MyModal from '@fastgpt/web/components/common/MyModal';
import { useTranslation } from 'next-i18next';
import MyTooltip from '@/components/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import MySelect from '@fastgpt/web/components/common/MySelect';
import { fnValueTypeSelect } from '@/web/core/workflow/constants/dataType';
export const defaultField: ContextExtractAgentItemType = {
valueType: 'string',
required: false,
defaultValue: '',
desc: '',
@@ -34,10 +37,11 @@ const ExtractFieldModal = ({
onSubmit: (data: ContextExtractAgentItemType) => void;
}) => {
const { t } = useTranslation();
const { register, handleSubmit, watch } = useForm<ContextExtractAgentItemType>({
const { register, setValue, handleSubmit, watch } = useForm<ContextExtractAgentItemType>({
defaultValues: defaultField
});
const required = watch('required');
const valueType = watch('valueType');
return (
<MyModal
@@ -68,8 +72,21 @@ const ExtractFieldModal = ({
</Flex>
)}
<Flex alignItems={'center'} mt={5}>
<Box flex={['0 0 80px', '0 0 100px']}>{t('core.module.Data Type')}</Box>
<Box flex={'1 0 0'}>
<MySelect
list={fnValueTypeSelect}
value={valueType}
onchange={(e: any) => {
setValue('valueType', e);
}}
/>
</Box>
</Flex>
<Flex mt={5} alignItems={'center'}>
<Box flex={['0 0 80px', '0 0 100px']}>{t('core.module.Field key')}</Box>
<Box flex={['0 0 80px', '0 0 100px']}>{t('Field name')}</Box>
<Input
bg={'myGray.50'}
placeholder="name/age/sql"
@@ -84,21 +101,23 @@ const ExtractFieldModal = ({
{...register('desc', { required: true })}
/>
</Flex>
<Box mt={5}>
<Flex alignItems={'center'}>
{t('core.module.extract.Enum Value')}({t('common.choosable')})
<MyTooltip label={t('core.module.extract.Enum Description')} forceShow>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Flex>
{(valueType === 'string' || valueType === 'number') && (
<Box mt={5}>
<Flex alignItems={'center'}>
{t('core.module.extract.Enum Value')}({t('common.choosable')})
<MyTooltip label={t('core.module.extract.Enum Description')} forceShow>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Flex>
<Textarea
rows={5}
bg={'myGray.50'}
placeholder={'apple\npeach\nwatermelon'}
{...register('enum')}
/>
</Box>
<Textarea
rows={5}
bg={'myGray.50'}
placeholder={'apple\npeach\nwatermelon'}
{...register('enum')}
/>
</Box>
)}
</ModalBody>
<ModalFooter>

View File

@@ -18,7 +18,6 @@ import NodeCard from '../render/NodeCard';
import Container from '../../components/Container';
import { AddIcon } from '@chakra-ui/icons';
import RenderInput from '../render/RenderInput';
import Divider from '../../components/Divider';
import type { ContextExtractAgentItemType } from '@fastgpt/global/core/workflow/type/index.d';
import RenderOutput from '../render/RenderOutput';
import MyIcon from '@fastgpt/web/components/common/Icon';
@@ -79,7 +78,7 @@ const NodeExtract = ({ data }: NodeProps<FlowNodeItemType>) => {
<Table bg={'white'}>
<Thead>
<Tr>
<Th bg={'myGray.50'}> key</Th>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'}></Th>

View File

@@ -79,7 +79,6 @@ const NodeLaf = (props: NodeProps<FlowNodeItemType>) => {
};
} catch (err) {
await putUpdateTeam({
teamId: userInfo?.team.teamId || '',
lafAccount: { token: '', appid: '', pat: '' }
});
initUserInfo();

View File

@@ -2,10 +2,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Box, Button, Card, Flex } from '@chakra-ui/react';
import MyIcon from '@fastgpt/web/components/common/Icon';
import Avatar from '@/components/Avatar';
import type {
FlowNodeItemType,
FlowNodeTemplateType
} from '@fastgpt/global/core/workflow/type/index.d';
import type { FlowNodeItemType } from '@fastgpt/global/core/workflow/type/index.d';
import { useTranslation } from 'next-i18next';
import { useEditTitle } from '@/web/common/hooks/useEditTitle';
import { useToast } from '@fastgpt/web/hooks/useToast';
@@ -16,7 +13,7 @@ import { ToolTargetHandle } from './Handle/ToolHandle';
import { useEditTextarea } from '@fastgpt/web/hooks/useEditTextarea';
import { ConnectionSourceHandle, ConnectionTargetHandle } from './Handle/ConnectionHandle';
import { useDebug } from '../../hooks/useDebug';
import { ResponseBox } from '@/components/ChatBox/WholeResponseModal';
import { ResponseBox } from '@/components/ChatBox/components/WholeResponseModal';
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';
import { getPreviewPluginModule } from '@/web/core/plugin/api';
import { storeNode2FlowNode, updateFlowNodeVersion } from '@/web/core/workflow/utils';
@@ -27,7 +24,6 @@ import { useI18n } from '@/web/context/I18n';
import { moduleTemplatesFlat } from '@fastgpt/global/core/workflow/template/constants';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import MyTooltip from '@/components/MyTooltip';
import { isEqual } from 'lodash';
import { useSystemStore } from '@/web/common/system/useSystemStore';
type Props = FlowNodeItemType & {

View File

@@ -20,6 +20,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
import { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io.d';
import { useContextSelector } from 'use-context-selector';
import { WorkflowContext } from '@/components/core/workflow/context';
import { fnValueTypeSelect } from '@/web/core/workflow/constants/dataType';
const EditFieldModal = ({
defaultValue = defaultEditFormData,
@@ -35,21 +36,6 @@ const EditFieldModal = ({
});
const valueType = watch('valueType');
const selectTypeList = useRef([
{
label: t('core.module.valueType.string'),
value: 'string'
},
{
label: t('core.module.valueType.number'),
value: 'number'
},
{
label: t('core.module.valueType.boolean'),
value: 'boolean'
}
]);
const { mutate: onclickSubmit } = useRequest({
mutationFn: async (e: FlowNodeInputItemType) => {
const inputConfig: FlowNodeInputItemType = {
@@ -105,7 +91,7 @@ const EditFieldModal = ({
<Box flex={'0 0 80px'}>{t('core.module.Data Type')}</Box>
<Box flex={'1 0 0'}>
<MySelect
list={selectTypeList.current}
list={fnValueTypeSelect}
value={valueType}
onchange={(e: any) => {
setValue('valueType', e);

View File

@@ -84,7 +84,6 @@ const LafAccountModal = ({
mutationFn: async (data: LafAccountType) => {
if (!userInfo?.team.teamId) return;
return putUpdateTeam({
teamId: userInfo?.team.teamId,
lafAccount: data
});
},
@@ -142,7 +141,6 @@ const LafAccountModal = ({
onClick={() => {
onResetForm();
putUpdateTeam({
teamId: userInfo?.team.teamId || '',
lafAccount: { token: '', appid: '', pat: '' }
});
}}

View File

@@ -83,7 +83,6 @@ function EditModal({
mutationFn: async (data: FormDataType) => {
if (!data.id) return Promise.resolve('');
return putUpdateTeam({
teamId: data.id,
name: data.name,
avatar: data.avatar
});

View File

@@ -4,7 +4,6 @@ import { useTranslation } from 'next-i18next';
import { useQuery } from '@tanstack/react-query';
import {
getTeamMembers,
putUpdateMember,
delRemoveMember,
getTeamList,
delLeaveTeam,
@@ -68,17 +67,10 @@ const TeamManageModal = ({ onClose }: { onClose: () => void }) => {
['getMembers', userInfo?.team?.teamId],
() => {
if (!userInfo?.team?.teamId) return [];
return getTeamMembers(userInfo.team.teamId);
return getTeamMembers();
}
);
const { mutate: onUpdateMember, isLoading: isLoadingUpdateMember } = useRequest({
mutationFn: putUpdateMember,
onSuccess() {
refetchMembers();
}
});
const { mutate: onRemoveMember, isLoading: isLoadingRemoveMember } = useRequest({
mutationFn: delRemoveMember,
onSuccess() {
@@ -147,13 +139,7 @@ const TeamManageModal = ({ onClose }: { onClose: () => void }) => {
<TeamList />
<TeamCard />
<Loading
loading={
isLoadingUpdateMember ||
isLoadingRemoveMember ||
isLoadingTeams ||
isLoadingLeaveTeam ||
isSwitchTeam
}
loading={isLoadingRemoveMember || isLoadingTeams || isLoadingLeaveTeam || isSwitchTeam}
fixed={false}
/>
</Box>

View File

@@ -57,7 +57,7 @@ const TeamTagsAsync = ({ onClose }: { onClose: () => void }) => {
// tags Async
const { mutate: onclickUpdate, isLoading: isUpdating } = useRequest({
mutationFn: async (data: FormType) => {
return putUpdateTeam({ teamDomain: data.teamDomain, teamId: teamInfo?.teamId });
return putUpdateTeam({ teamDomain: data.teamDomain });
},
onSuccess() {
initUserInfo();

View File

@@ -59,7 +59,7 @@ const UsageTable = () => {
const [selectTmbId, setSelectTmbId] = useState(userInfo?.team?.tmbId);
const { data: members = [] } = useQuery(['getMembers', userInfo?.team?.teamId], () => {
if (!userInfo?.team?.teamId) return [];
return getTeamMembers(userInfo.team.teamId);
return getTeamMembers();
});
const tmbList = useMemo(
() =>

View File

@@ -0,0 +1,21 @@
import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';
import { NextAPI } from '@/service/middleware/entry';
import { UpdateTeamProps } from '@fastgpt/global/support/user/team/controller';
import { authTeamOwner } from '@fastgpt/service/support/permission/auth/user';
import { updateTeam } from '@fastgpt/service/support/user/team/controller';
export type updateQuery = {};
export type updateBody = {};
export type updateResponse = {};
async function handler(req: ApiRequestProps<updateBody, updateQuery>, res: ApiResponseType<any>) {
const body = req.body as UpdateTeamProps;
const { teamId } = await authTeamOwner({ req, authToken: true });
await updateTeam({ teamId, ...body });
}
export default NextAPI(handler);

View File

@@ -26,13 +26,13 @@ const FormLayout = ({ children, setPageType, pageType }: Props) => {
const redirectUri = `${location.origin}/login/provider`;
const oAuthList = [
...(feConfigs?.oauth?.github
...(feConfigs?.oauth?.wechat && pageType !== LoginPageTypeEnum.wechat
? [
{
label: t('support.user.login.Github'),
provider: OAuthEnum.github,
icon: 'common/gitFill',
redirectUrl: `https://github.com/login/oauth/authorize?client_id=${feConfigs?.oauth?.github}&redirect_uri=${redirectUri}&state=${state.current}&scope=user:email%20read:user`
label: t('support.user.login.Wechat'),
provider: OAuthEnum.wechat,
icon: 'common/wechatFill',
pageType: LoginPageTypeEnum.wechat
}
]
: []),
@@ -46,13 +46,13 @@ const FormLayout = ({ children, setPageType, pageType }: Props) => {
}
]
: []),
...(feConfigs?.oauth?.wechat && pageType !== LoginPageTypeEnum.wechat
...(feConfigs?.oauth?.github
? [
{
label: t('support.user.login.Wechat'),
provider: OAuthEnum.wechat,
icon: 'common/wechatFill',
pageType: LoginPageTypeEnum.wechat
label: t('support.user.login.Github'),
provider: OAuthEnum.github,
icon: 'common/gitFill',
redirectUrl: `https://github.com/login/oauth/authorize?client_id=${feConfigs?.oauth?.github}&redirect_uri=${redirectUri}&state=${state.current}&scope=user:email%20read:user`
}
]
: []),

View File

@@ -118,7 +118,6 @@ function responseError(
})
.then((res) => {
putUpdateTeam({
teamId: useUserStore.getState().userInfo?.team.teamId || '',
lafAccount: {
...useUserStore.getState().userInfo?.team?.lafAccount,
token: res

View File

@@ -85,3 +85,18 @@ export const FlowValueTypeMap = {
description: ''
}
};
export const fnValueTypeSelect = [
{
label: 'String',
value: 'string'
},
{
label: 'Number',
value: 'number'
},
{
label: 'Boolean',
value: 'boolean'
}
];

View File

@@ -22,18 +22,15 @@ export const getTeamList = (status: `${TeamMemberSchema['status']}`) =>
GET<TeamItemType[]>(`/proApi/support/user/team/list`, { status });
export const postCreateTeam = (data: CreateTeamProps) =>
POST<string>(`/proApi/support/user/team/create`, data);
export const putUpdateTeam = (data: UpdateTeamProps) =>
PUT(`/proApi/support/user/team/update`, data);
export const putUpdateTeam = (data: UpdateTeamProps) => PUT(`/support/user/team/update`, data);
export const putSwitchTeam = (teamId: string) =>
PUT<string>(`/proApi/support/user/team/switch`, { teamId });
/* --------------- team member ---------------- */
export const getTeamMembers = (teamId: string) =>
GET<TeamMemberItemType[]>(`/proApi/support/user/team/member/list`, { teamId });
export const getTeamMembers = () =>
GET<TeamMemberItemType[]>(`/proApi/support/user/team/member/list`);
export const postInviteTeamMember = (data: InviteMemberProps) =>
POST<InviteMemberResponse>(`/proApi/support/user/team/member/invite`, data);
export const putUpdateMember = (data: UpdateTeamMemberProps) =>
PUT(`/proApi/support/user/team/member/update`, data);
export const putUpdateMemberName = (name: string) =>
PUT(`/proApi/support/user/team/member/updateName`, { name });
export const delRemoveMember = (props: DelMemberProps) =>