Updae theme and fix some bug (#1711)

This commit is contained in:
Archer
2024-06-07 12:54:30 +08:00
committed by GitHub
parent 19c8a06d51
commit b20d075d35
153 changed files with 1587 additions and 1436 deletions

View File

@@ -3,7 +3,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore';
import { Box, Flex, Image, Spinner, Textarea } from '@chakra-ui/react';
import React, { useRef, useEffect, useCallback } from 'react';
import { useTranslation } from 'next-i18next';
import MyTooltip from '../../MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
import { compressImgFileAndUpload } from '@/web/common/file/controller';

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 '@fastgpt/web/components/common/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';
@@ -108,9 +108,9 @@ const ResponseTags = ({
<MyTooltip key={item.collectionId} label={t('core.chat.quote.Read Quote')}>
<Flex
alignItems={'center'}
fontSize={'sm'}
fontSize={'xs'}
border={theme.borders.sm}
py={1}
py={1.5}
px={2}
borderRadius={'sm'}
_hover={{
@@ -149,7 +149,7 @@ const ResponseTags = ({
<MyTooltip label="查看引用">
<MyTag
colorSchema="blue"
type="solid"
type="borderSolid"
cursor={'pointer'}
onClick={() => setQuoteModalData({ rawSearch: quoteList })}
>
@@ -164,7 +164,7 @@ const ResponseTags = ({
<MyTag
colorSchema="green"
cursor={'pointer'}
type="solid"
type="borderSolid"
onClick={() => setContextModalData(historyPreview)}
>
{historyPreview.length}
@@ -174,20 +174,25 @@ const ResponseTags = ({
</>
)}
{llmModuleAccount > 1 && (
<MyTag type="solid" colorSchema="blue">
<MyTag type="borderSolid" colorSchema="blue">
AI
</MyTag>
)}
{isPc && runningTime > 0 && (
<MyTooltip label={'模块运行时间和'}>
<MyTag colorSchema="purple" type="solid" cursor={'default'}>
<MyTag colorSchema="purple" type="borderSolid" cursor={'default'}>
{runningTime}s
</MyTag>
</MyTooltip>
)}
<MyTooltip label={t('core.chat.response.Read complete response tips')}>
<MyTag colorSchema="gray" type="solid" cursor={'pointer'} onClick={onOpenWholeModal}>
<MyTag
colorSchema="gray"
type="borderSolid"
cursor={'pointer'}
onClick={onOpenWholeModal}
>
{t('core.chat.response.Read complete response')}
</MyTag>
</MyTooltip>

View File

@@ -8,6 +8,7 @@ import DatasetSelectModal, { useDatasetSelect } from '@/components/core/dataset/
import dynamic from 'next/dynamic';
import { AdminFbkType } from '@fastgpt/global/core/chat/type.d';
import SelectCollections from '@/web/core/dataset/components/SelectCollections';
import EmptyTip from '@fastgpt/web/components/common/EmptyTip';
const InputDataModal = dynamic(() => import('@/pages/dataset/detail/components/InputDataModal'));
@@ -76,7 +77,7 @@ const SelectMarkCollection = ({
>
<Flex alignItems={'center'} h={'38px'}>
<Avatar src={item.avatar} w={['24px', '28px', '32px']}></Avatar>
<Box ml={3} fontWeight={'bold'} fontSize={['md', 'lg', 'xl']}>
<Box ml={3} fontWeight={'bold'} fontSize={['md', 'lg']}>
{item.name}
</Box>
</Flex>
@@ -89,14 +90,7 @@ const SelectMarkCollection = ({
})()
)}
</Grid>
{datasets.length === 0 && (
<Flex mt={'10vh'} flexDirection={'column'} alignItems={'center'}>
<MyIcon name="empty" w={'48px'} h={'48px'} color={'transparent'} />
<Box mt={2} color={'myGray.500'}>
西~
</Box>
</Flex>
)}
{datasets.length === 0 && <EmptyTip text={'这个目录已经没东西可选了~'}></EmptyTip>}
</ModalBody>
</DatasetSelectModal>
)}

View File

@@ -6,13 +6,13 @@ import { moduleTemplatesFlat } from '@fastgpt/global/core/workflow/template/cons
import Tabs from '../../Tabs';
import MyModal from '@fastgpt/web/components/common/MyModal';
import MyTooltip from '../../MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import Markdown from '../../Markdown';
import { QuoteList } from './QuoteModal';
import { DatasetSearchModeMap } from '@fastgpt/global/core/dataset/constants';
import { formatNumber } from '@fastgpt/global/common/math/tools';
import { useI18n } from '@/web/context/I18n';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
function RowRender({
children,
@@ -22,10 +22,10 @@ function RowRender({
}: { children: React.ReactNode; label: string } & BoxProps) {
return (
<Box mb={3}>
<Box fontSize={['sm', 'md']} mb={mb} flex={'0 0 90px'}>
<Box fontSize={'sm'} mb={mb} flex={'0 0 90px'}>
{label}:
</Box>
<Box borderRadius={'sm'} fontSize={'sm'} bg={'myGray.50'} {...props}>
<Box borderRadius={'sm'} fontSize={['xs', 'sm']} bg={'myGray.50'} {...props}>
{children}
</Box>
</Box>
@@ -98,9 +98,7 @@ const WholeResponseModal = ({
title={
<Flex alignItems={'center'}>
{t('core.chat.response.Complete Response')}
<MyTooltip label={'从左往右,为各个模块的响应顺序'}>
<QuestionOutlineIcon ml={2} />
</MyTooltip>
<QuestionTip ml={2} label={'从左往右,为各个模块的响应顺序'}></QuestionTip>
</Flex>
}
>

View File

@@ -32,7 +32,7 @@ import {
} from '@/web/core/chat/api';
import type { AdminMarkType } from './components/SelectMarkCollection';
import MyTooltip from '../MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { postQuestionGuide } from '@/web/core/ai/api';
import type {

View File

@@ -10,7 +10,7 @@ import Avatar from '../Avatar';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useTranslation } from 'next-i18next';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import MyTooltip from '../MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { getDocPath } from '@/web/common/system/doc';
export enum NavbarTypeEnum {

View File

@@ -4,7 +4,7 @@ import 'katex/dist/katex.min.css';
import ChatBoxDivider from '@/components/core/chat/Divider';
import { useTranslation } from 'next-i18next';
import { EventNameEnum, eventBus } from '@/web/common/utils/eventbus';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import MyIcon from '@fastgpt/web/components/common/Icon';
const QuestionGuide = ({ text }: { text: string }) => {
@@ -31,7 +31,7 @@ const QuestionGuide = ({ text }: { text: string }) => {
key={text}
alignItems={'center'}
flexWrap={'wrap'}
fontSize={'sm'}
fontSize={'xs'}
border={theme.borders.sm}
py={'1px'}
px={3}

View File

@@ -105,16 +105,16 @@
font-size: inherit;
}
.markdown h1 {
font-size: 28px;
font-size: var(--chakra-fontSizes-2xl);
}
.markdown h2 {
font-size: 24px;
font-size: var(--chakra-fontSizes-xl);
}
.markdown h3 {
font-size: 18px;
font-size: var(--chakra-fontSizes-lg);
}
.markdown h4 {
font-size: 16px;
font-size: var(--chakra-fontSizes-md);
}
.markdown h5 {
font-size: 14px;
@@ -346,6 +346,7 @@
tab-size: 4;
word-spacing: normal;
width: 100%;
font-size: var(--chakra-fontSizes-sm);
* {
word-break: break-word;

View File

@@ -10,7 +10,7 @@ import styles from './index.module.scss';
import dynamic from 'next/dynamic';
import { Link, Button } from '@chakra-ui/react';
import MyTooltip from '../MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useTranslation } from 'next-i18next';
import { EventNameEnum, eventBus } from '@/web/common/utils/eventbus';
import MyIcon from '@fastgpt/web/components/common/Icon';

View File

@@ -1,35 +0,0 @@
import React from 'react';
import { Tooltip, TooltipProps } from '@chakra-ui/react';
import { useSystemStore } from '@/web/common/system/useSystemStore';
interface Props extends TooltipProps {
forceShow?: boolean;
}
const MyTooltip = ({ children, forceShow = false, shouldWrapChildren = true, ...props }: Props) => {
const { isPc } = useSystemStore();
return isPc || forceShow ? (
<Tooltip
className="tooltip"
bg={'white'}
arrowShadowColor={' rgba(0,0,0,0.05)'}
hasArrow
arrowSize={12}
offset={[-15, 15]}
color={'myGray.800'}
px={4}
py={2}
borderRadius={'8px'}
whiteSpace={'pre-wrap'}
boxShadow={'1px 1px 10px rgba(0,0,0,0.2)'}
shouldWrapChildren={shouldWrapChildren}
{...props}
>
{children}
</Tooltip>
) : (
<>{children}</>
);
};
export default MyTooltip;

View File

@@ -37,9 +37,9 @@ const PromptTemplate = ({
: {})}
onClick={() => setSelectTemplateTitle(item)}
>
<Box>{item.title}</Box>
<Box color={'myGray.900'}>{item.title}</Box>
<Box color={'myGray.600'} fontSize={'sm'} whiteSpace={'pre-wrap'}>
<Box color={'myGray.500'} fontSize={'xs'} whiteSpace={'pre-wrap'}>
{item.desc}
</Box>
</Box>

View File

@@ -17,17 +17,17 @@ const SideTabs = ({ list, size = 'md', activeId, onChange, ...props }: Props) =>
switch (size) {
case 'sm':
return {
fontSize: 'sm',
fontSize: 'xs',
inlineP: 1
};
case 'md':
return {
fontSize: 'md',
fontSize: 'sm',
inlineP: 2
};
case 'lg':
return {
fontSize: 'lg',
fontSize: 'md',
inlineP: 3
};
}
@@ -55,7 +55,8 @@ const SideTabs = ({ list, size = 'md', activeId, onChange, ...props }: Props) =>
color: 'myGray.600'
})}
_hover={{
bg: 'myGray.05'
color: 'primary.600',
bg: 'myGray.100'
}}
onClick={() => {
if (activeId === item.id) return;

View File

@@ -47,7 +47,6 @@ const MySlider = ({
max={max}
min={min}
step={step}
size={'lg'}
value={value}
width={width}
onChange={onChange}

View File

@@ -18,19 +18,19 @@ const Tabs = ({ list, size = 'md', activeId, onChange, ...props }: Props) => {
switch (size) {
case 'sm':
return {
fontSize: 'sm',
fontSize: 'xs',
outP: '3px',
inlineP: 1
};
case 'md':
return {
fontSize: ['sm', 'md'],
fontSize: 'sm',
outP: '4px',
inlineP: 1
};
case 'lg':
return {
fontSize: ['md', 'lg'],
fontSize: ['sm', 'md'],
outP: '5px',
inlineP: 2
};

View File

@@ -1,5 +1,5 @@
import React from 'react';
import { Box, Flex, useTheme, Grid, type GridProps, theme, Image } from '@chakra-ui/react';
import { Box, Flex, useTheme, Grid, type GridProps, theme, Image, Radio } from '@chakra-ui/react';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useTranslation } from 'next-i18next';
import { useToast } from '@fastgpt/web/hooks/useToast';
@@ -36,7 +36,7 @@ const MyRadio = ({
const { toast } = useToast();
return (
<Grid gridGap={[3, 5]} fontSize={['sm', 'md']} {...props}>
<Grid gridGap={[3, 5]} {...props}>
{list.map((item) => (
<Flex
key={item.value}
@@ -44,8 +44,7 @@ const MyRadio = ({
cursor={'pointer'}
userSelect={'none'}
py={3}
pl={'14px'}
pr={hiddenCircle ? '14px' : '36px'}
px={'4'}
p={p !== undefined ? `${p} !important` : undefined}
border={theme.borders.sm}
borderWidth={'1.5px'}
@@ -62,27 +61,6 @@ const MyRadio = ({
borderColor: 'primary.400'
}
})}
_after={{
content: '""',
display: hiddenCircle ? 'none' : 'block',
position: 'absolute',
right: '14px',
w: '16px',
h: '16px',
mr: 1,
borderRadius: '16px',
transition: '0.2s',
boxSizing: 'border-box',
...(value === item.value
? {
border: '5px solid',
borderColor: 'primary.600'
}
: {
border: '2px solid',
borderColor: 'myGray.200'
})
}}
onClick={() => {
if (item.forbidTip) {
toast({
@@ -103,14 +81,17 @@ const MyRadio = ({
)}
</>
)}
<Box pr={hiddenCircle ? 0 : 2} color={'myGray.800'}>
<Box>{typeof item.title === 'string' ? t(item.title) : item.title}</Box>
<Box pr={hiddenCircle ? 0 : 2} flex={'1 0 0'}>
<Box fontSize={'sm'} color={'myGray.800'}>
{typeof item.title === 'string' ? t(item.title) : item.title}
</Box>
{!!item.desc && (
<Box fontSize={'xs'} color={'myGray.500'} lineHeight={1.2}>
<Box fontSize={'mini'} color={'myGray.500'} lineHeight={1.2}>
{t(item.desc)}
</Box>
)}
</Box>
<Radio isChecked={value === item.value} />
</Flex>
))}
</Grid>

View File

@@ -37,7 +37,7 @@ const ParentPaths = (props: {
{concatPaths.map((item, i) => (
<Flex key={item.parentId || i} alignItems={'center'}>
<Box
fontSize={['sm', fontSize || 'lg']}
fontSize={['sm', fontSize || 'md']}
py={1}
px={[1, 2]}
borderRadius={'md'}

View File

@@ -38,7 +38,7 @@ const RowTabs = ({ list, value, onChange, py = '7px', px = '12px', ...props }: P
})}
>
{item.icon && <MyIcon name={item.icon as any} mr={1} w={'14px'} />}
<Box>{item.label}</Box>
<Box fontSize={'sm'}>{item.label}</Box>
</Flex>
))}
</Box>

View File

@@ -9,7 +9,7 @@ import {
TextareaProps,
useDisclosure
} from '@chakra-ui/react';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyModal from '@fastgpt/web/components/common/MyModal';

View File

@@ -19,8 +19,6 @@ import type { SettingAIDataType } from '@fastgpt/global/core/app/type.d';
import { getDocPath } from '@/web/common/system/doc';
import AIModelSelector from '@/components/Select/AIModelSelector';
import { LLMModelItemType } from '@fastgpt/global/core/ai/model.d';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
const AIChatSettingsModal = ({
@@ -65,7 +63,8 @@ const AIChatSettingsModal = ({
const LabelStyles: BoxProps = {
display: 'flex',
alignItems: 'center',
fontSize: ['sm', 'md'],
fontSize: 'sm',
color: 'myGray.900',
width: ['80px', '90px']
};
@@ -209,14 +208,14 @@ const AIChatSettingsModal = ({
<Flex mt={8} alignItems={'center'}>
<Box {...LabelStyles}>
{t('core.app.Ai response')}
<MyTooltip label={t('core.module.template.AI response switch tip')}>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
<QuestionTip
ml={1}
label={t('core.module.template.AI response switch tip')}
></QuestionTip>
</Box>
<Box flex={1} ml={'10px'}>
<Switch
isChecked={getValues(NodeInputKeyEnum.aiChatIsResponseText)}
size={'lg'}
onChange={(e) => {
const value = e.target.checked;
setValue(NodeInputKeyEnum.aiChatIsResponseText, value);

View File

@@ -12,9 +12,8 @@ import {
useTheme
} from '@chakra-ui/react';
import { useForm } from 'react-hook-form';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import MySlider from '@/components/Slider';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { DatasetSearchModeEnum } from '@fastgpt/global/core/dataset/constants';
import { useTranslation } from 'next-i18next';
@@ -29,6 +28,8 @@ import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor';
import { useUserStore } from '@/web/support/user/useUserStore';
import { useToast } from '@fastgpt/web/hooks/useToast';
import SelectAiModel from '@/components/Select/AIModelSelector';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
export type DatasetParamsProps = {
searchMode: `${DatasetSearchModeEnum}`;
@@ -158,8 +159,7 @@ const DatasetParamsModal = ({
cursor={'pointer'}
userSelect={'none'}
py={3}
pl={'14px'}
pr={'16px'}
px={4}
border={theme.borders.sm}
borderWidth={'1.5px'}
borderRadius={'md'}
@@ -191,8 +191,8 @@ const DatasetParamsModal = ({
>
<MyIcon name="core/dataset/rerank" w={'18px'} mr={'14px'} />
<Box pr={2} color={'myGray.800'} flex={'1 0 0'}>
<Box>{t('core.dataset.search.ReRank')}</Box>
<Box fontSize={['xs', 'sm']} color={'myGray.500'}>
<Box fontSize={'sm'}>{t('core.dataset.search.ReRank')}</Box>
<Box fontSize={'xs'} color={'myGray.500'}>
{t('core.dataset.search.ReRank desc')}
</Box>
</Box>
@@ -208,12 +208,13 @@ const DatasetParamsModal = ({
<Box pt={5}>
{limit !== undefined && (
<Box display={['block', 'flex']}>
<Box flex={'0 0 120px'} mb={[8, 0]}>
{t('core.dataset.search.Max Tokens')}
<MyTooltip label={t('core.dataset.search.Max Tokens Tips')} forceShow>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Box>
<Flex flex={'0 0 120px'} mb={[8, 0]}>
<FormLabel>{t('core.dataset.search.Max Tokens')}</FormLabel>
<QuestionTip
ml={1}
label={t('core.dataset.search.Max Tokens Tips')}
></QuestionTip>
</Flex>
<Box flex={1} mx={4}>
<MySlider
markList={[
@@ -233,12 +234,13 @@ const DatasetParamsModal = ({
</Box>
)}
<Box display={['block', 'flex']} mt={10}>
<Box flex={'0 0 120px'} mb={[8, 0]}>
{t('core.dataset.search.Min Similarity')}
<MyTooltip label={t('core.dataset.search.Min Similarity Tips')} forceShow>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Box>
<Flex flex={'0 0 120px'} mb={[8, 0]}>
<FormLabel>{t('core.dataset.search.Min Similarity')}</FormLabel>
<QuestionTip
ml={1}
label={t('core.dataset.search.Min Similarity Tips')}
></QuestionTip>
</Flex>
<Box flex={1} mx={4}>
{showSimilarity ? (
<MySlider
@@ -264,7 +266,7 @@ const DatasetParamsModal = ({
)}
{currentTabType === SearchSettingTabEnum.queryExtension && (
<Box>
<Box fontSize={'xs'} color={'myGray.500'}>
<Box transform={'translateY(-5px)'} fontSize={'xs'} color={'myGray.500'}>
{t('core.dataset.Query extension intro')}
</Box>
<Flex mt={3} alignItems={'center'}>
@@ -274,8 +276,8 @@ const DatasetParamsModal = ({
{datasetSearchUsingCfrForm === true && (
<>
<Flex mt={4} alignItems={'center'}>
<Box flex={'0 0 100px'}>{t('core.ai.Model')}</Box>
<Box flex={'1 0 0'}>
<FormLabel flex={['0 0 80px', '1 0 0']}>{t('core.ai.Model')}</FormLabel>
<Box flex={['1 0 0', '0 0 300px']}>
<SelectAiModel
width={'100%'}
value={queryExtensionModel}
@@ -288,10 +290,11 @@ const DatasetParamsModal = ({
</Flex>
<Box mt={3}>
<Flex alignItems={'center'}>
{t('core.app.edit.Query extension background prompt')}
<MyTooltip label={t('core.app.edit.Query extension background tip')} forceShow>
<QuestionOutlineIcon display={['none', 'inline']} ml={1} />
</MyTooltip>
<FormLabel>{t('core.app.edit.Query extension background prompt')}</FormLabel>
<QuestionTip
ml={1}
label={t('core.app.edit.Query extension background tip')}
></QuestionTip>
</Flex>
<Box mt={1}>
<PromptEditor

View File

@@ -13,7 +13,7 @@ import {
import Avatar from '@/components/Avatar';
import type { SelectedDatasetType } from '@fastgpt/global/core/workflow/api.d';
import { useToast } from '@fastgpt/web/hooks/useToast';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { DatasetTypeEnum } from '@fastgpt/global/core/dataset/constants';
import { useTranslation } from 'next-i18next';
@@ -163,7 +163,7 @@ export const DatasetSelectModal = ({
className="textEllipsis"
ml={3}
fontWeight={'bold'}
fontSize={['md', 'lg', 'xl']}
fontSize={['md', 'lg']}
>
{item.name}
</Box>

View File

@@ -1,5 +1,5 @@
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import {
Box,
Button,
@@ -34,10 +34,10 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
import { useSelectFile } from '@/web/common/file/hooks/useSelectFile';
import { readCsvRawText } from '@fastgpt/web/common/file/utils';
import { useRequest2 } from '@fastgpt/web/hooks/useRequest';
import { useRequest } from 'ahooks';
import HighlightText from '@fastgpt/web/components/common/String/HighlightText';
import { defaultChatInputGuideConfig } from '@fastgpt/global/core/app/constants';
import ChatFunctionTip from './Tip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const csvTemplate = `"第一列内容"
"只会将第一列内容导入,其余列会被忽略"
@@ -85,10 +85,10 @@ const InputGuideConfig = ({
return (
<Flex alignItems={'center'}>
<MyIcon name={'core/app/inputGuides'} mr={2} w={'20px'} />
<HStack>
<Box>{chatT('Input guide')}</Box>
<Flex alignItems={'center'}>
<FormLabel>{chatT('Input guide')}</FormLabel>
<ChatFunctionTip type={'inputGuide'} />
</HStack>
</Flex>
<Box flex={1} />
<MyTooltip label={chatT('Config input guide')}>
<Button
@@ -109,10 +109,9 @@ const InputGuideConfig = ({
>
<ModalBody px={[5, 16]} py={[4, 8]} w={'500px'}>
<Flex justifyContent={'space-between'} alignItems={'center'}>
{t('Is open')}
<FormLabel>{t('Is open')}</FormLabel>
<Switch
isChecked={isOpenQuestionGuide}
size={'lg'}
onChange={(e) => {
onChange({
...value,
@@ -124,7 +123,7 @@ const InputGuideConfig = ({
{isOpenQuestionGuide && (
<>
<Flex mt={8} alignItems={'center'}>
{chatT('Input guide lexicon')}
<FormLabel>{chatT('Input guide lexicon')}</FormLabel>
<Box fontSize={'xs'} px={2} bg={'myGray.100'} ml={1} rounded={'full'}>
{total}
</Box>
@@ -142,7 +141,7 @@ const InputGuideConfig = ({
</Flex>
<>
<Flex mt={8} alignItems={'center'}>
{chatT('Custom input guide url')}
<FormLabel>{chatT('Custom input guide url')}</FormLabel>
<Flex
onClick={() => window.open(getDocPath('/docs/course/chat_input_guide'))}
color={'primary.700'}
@@ -203,7 +202,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () =>
refreshDeps: [searchKey],
debounceWait: 300,
itemHeight: 46,
itemHeight: 48,
overscan: 20,
pageSize: 20,
@@ -381,6 +380,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () =>
<ScrollList
px={8}
flex={'1 0 0'}
fontSize={'sm'}
EmptyChildren={<EmptyTip text={chatT('Chat input guide lexicon is empty')} />}
>
{list.map((data, index) => {
@@ -394,7 +394,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () =>
key={index}
alignItems={'center'}
h={10}
mt={3}
mt={2}
_hover={{
'& .icon-list': {
display: 'flex'
@@ -402,7 +402,6 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () =>
}}
>
<Checkbox
size={'lg'}
mr={2}
isChecked={selected}
onChange={(e) => {

View File

@@ -3,6 +3,7 @@ import { Box, Flex, Switch, type SwitchProps } from '@chakra-ui/react';
import React from 'react';
import { useTranslation } from 'next-i18next';
import ChatFunctionTip from './Tip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
// question generator switch
const QGSwitch = (props: SwitchProps) => {
@@ -10,7 +11,7 @@ const QGSwitch = (props: SwitchProps) => {
return (
<Flex alignItems={'center'}>
<MyIcon name={'core/chat/QGFill'} mr={2} w={'20px'} />
<Box fontWeight={'medium'}>{t('core.app.Question Guide')}</Box>
<FormLabel>{t('core.app.Question Guide')}</FormLabel>
<ChatFunctionTip type={'nextQuestion'} />
<Box flex={1} />
<Switch {...props} />

View File

@@ -1,4 +1,13 @@
import { Box, Button, Flex, ModalBody, useDisclosure, Switch, Textarea } from '@chakra-ui/react';
import {
Box,
Button,
Flex,
ModalBody,
useDisclosure,
Switch,
Textarea,
HStack
} from '@chakra-ui/react';
import React, { useCallback, useEffect, useMemo, useRef } from 'react';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useTranslation } from 'next-i18next';
@@ -10,6 +19,7 @@ import dynamic from 'next/dynamic';
import type { MultipleSelectProps } from '@fastgpt/web/components/common/MySelect/type.d';
import { cronParser2Fields } from '@fastgpt/global/common/string/time';
import TimezoneSelect from '@fastgpt/web/components/common/MySelect/TimezoneSelect';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const MultipleRowSelect = dynamic(
() => import('@fastgpt/web/components/common/MySelect/MultipleRowSelect')
@@ -135,7 +145,7 @@ const ScheduledTriggerConfig = ({
defaultPrompt?: string;
}) => {
onChange({
cronString: cronString ?? value?.cronString ?? '0 0 * * *',
cronString: cronString ?? value?.cronString ?? '',
timezone: timezone ?? value?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone,
defaultPrompt: defaultPrompt ?? value?.defaultPrompt ?? ''
});
@@ -243,10 +253,10 @@ const ScheduledTriggerConfig = ({
<>
<Flex alignItems={'center'}>
<MyIcon name={'core/app/schedulePlan'} w={'20px'} />
<Flex alignItems={'center'} ml={2} flex={1}>
{t('core.app.Interval timer run')}
<QuestionTip ml={1} label={t('core.app.Interval timer tip')} />
</Flex>
<HStack ml={2} flex={1} spacing={1}>
<FormLabel>{t('core.app.Interval timer run')}</FormLabel>
<QuestionTip label={t('core.app.Interval timer tip')} />
</HStack>
<MyTooltip label={t('core.app.Config schedule plan')}>
<Button
variant={'transparentBase'}
@@ -269,9 +279,8 @@ const ScheduledTriggerConfig = ({
>
<ModalBody>
<Flex justifyContent={'space-between'} alignItems={'center'}>
<Box flex={'0 0 80px'}> {t('core.app.schedule.Open schedule')}</Box>
<FormLabel flex={'0 0 80px'}> {t('core.app.schedule.Open schedule')}</FormLabel>
<Switch
size={'lg'}
isChecked={isOpenSchedule}
onChange={(e) => {
if (e.target.checked) {
@@ -285,7 +294,7 @@ const ScheduledTriggerConfig = ({
{isOpenSchedule && (
<>
<Flex alignItems={'center'} mt={5}>
<Box flex={'0 0 80px'}></Box>
<FormLabel flex={'0 0 80px'}></FormLabel>
<Box flex={'1 0 0'}>
<MultipleRowSelect
label={formatLabel}
@@ -298,7 +307,7 @@ const ScheduledTriggerConfig = ({
</Box>
</Flex>
<Flex alignItems={'center'} mt={5}>
<Box flex={'0 0 80px'}></Box>
<FormLabel flex={'0 0 80px'}></FormLabel>
<Box flex={'1 0 0'}>
<TimezoneSelect
value={timezone}
@@ -309,7 +318,7 @@ const ScheduledTriggerConfig = ({
</Box>
</Flex>
<Box mt={5}>
<Box mb={1}>{t('core.app.schedule.Default prompt')}</Box>
<FormLabel mb={1}>{t('core.app.schedule.Default prompt')}</FormLabel>
<Textarea
value={defaultPrompt}
rows={8}

View File

@@ -1,5 +1,5 @@
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { Box, Button, Flex, ModalBody, useDisclosure, Image } from '@chakra-ui/react';
import React, { useCallback, useMemo } from 'react';
import { useTranslation } from 'next-i18next';
@@ -12,6 +12,7 @@ import MySlider from '@/components/Slider';
import MySelect from '@fastgpt/web/components/common/MySelect';
import { defaultTTSConfig } from '@fastgpt/global/core/app/constants';
import ChatFunctionTip from './Tip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const TTSSelect = ({
value = defaultTTSConfig,
@@ -81,7 +82,7 @@ const TTSSelect = ({
return (
<Flex alignItems={'center'}>
<MyIcon name={'core/app/simpleMode/tts'} mr={2} w={'20px'} />
<Box fontWeight={'medium'}>{t('core.app.TTS')}</Box>
<FormLabel>{t('core.app.TTS')}</FormLabel>
<ChatFunctionTip type={'tts'} />
<Box flex={1} />
<MyTooltip label={t('core.app.Select TTS')}>
@@ -108,11 +109,11 @@ const TTSSelect = ({
>
<ModalBody px={[5, 16]} py={[4, 8]}>
<Flex justifyContent={'space-between'} alignItems={'center'}>
{t('core.app.tts.Speech model')}
<FormLabel>{t('core.app.tts.Speech model')}</FormLabel>
<MySelect w={'220px'} value={formatValue} list={list} onchange={onclickChange} />
</Flex>
<Flex mt={8} justifyContent={'space-between'}>
{t('core.app.tts.Speech speed')}
<FormLabel>{t('core.app.tts.Speech speed')}</FormLabel>
<MySlider
markList={[
{ label: '0.3', value: 0.3 },

View File

@@ -65,7 +65,7 @@ const ChatFunctionTip = ({ type }: { type: `${FnTypeEnum}` }) => {
</Box>
</Box>
</Flex>
<Image src={data.imgUrl} w={'100%'} minH={['auto', '200px']} mt={2} alt={''} />
<Image src={data.imgUrl} w={'100%'} minH={['auto', '250px']} mt={2} alt={''} />
</Box>
}
/>

View File

@@ -22,7 +22,7 @@ import {
TableContainer,
useDisclosure
} from '@chakra-ui/react';
import { QuestionOutlineIcon, SmallAddIcon } from '@chakra-ui/icons';
import { SmallAddIcon } from '@chakra-ui/icons';
import { VariableInputEnum, variableMap } from '@fastgpt/global/core/workflow/constants';
import type { VariableItemType } from '@fastgpt/global/core/app/type.d';
import MyIcon from '@fastgpt/web/components/common/Icon';
@@ -31,12 +31,12 @@ import { useFieldArray } from 'react-hook-form';
import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 6);
import MyModal from '@fastgpt/web/components/common/MyModal';
import MyTooltip from '@/components/MyTooltip';
import { useTranslation } from 'next-i18next';
import { useToast } from '@fastgpt/web/hooks/useToast';
import MyRadio from '@/components/common/MyRadio';
import { formatEditorVariablePickerIcon } from '@fastgpt/global/core/workflow/utils';
import ChatFunctionTip from './Tip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const VariableEdit = ({
variables = [],
@@ -96,9 +96,9 @@ const VariableEdit = ({
<Box>
<Flex alignItems={'center'}>
<MyIcon name={'core/app/simpleMode/variable'} w={'20px'} />
<Box ml={2} fontWeight={'medium'}>
<FormLabel ml={2} fontWeight={'medium'}>
{t('core.module.Variable')}
</Box>
</FormLabel>
<ChatFunctionTip type={'variable'} />
<Box flex={1} />
<Button
@@ -118,14 +118,19 @@ const VariableEdit = ({
{formatVariables.length > 0 && (
<Box mt={2} borderRadius={'md'} overflow={'hidden'} borderWidth={'1px'} borderBottom="none">
<TableContainer>
<Table bg={'white'}>
<Table>
<Thead>
<Tr bg={'myGray.50'}>
<Th w={'18px !important'} p={0} />
<Th>{t('core.module.variable.variable name')}</Th>
<Th>{t('core.module.variable.key')}</Th>
<Th>{t('common.Require Input')}</Th>
<Th></Th>
<Tr>
<Th
fontSize={'mini'}
borderRadius={'none !important'}
w={'18px !important'}
p={0}
/>
<Th fontSize={'mini'}>{t('core.module.variable.variable name')}</Th>
<Th fontSize={'mini'}>{t('core.module.variable.key')}</Th>
<Th fontSize={'mini'}>{t('common.Require Input')}</Th>
<Th fontSize={'mini'} borderRadius={'none !important'}></Th>
</Tr>
</Thead>
<Tbody>
@@ -174,12 +179,12 @@ const VariableEdit = ({
<ModalBody>
{variableType !== VariableInputEnum.custom && (
<Flex alignItems={'center'}>
<Box w={'70px'}>{t('common.Require Input')}</Box>
<FormLabel w={'70px'}>{t('common.Require Input')}</FormLabel>
<Switch {...registerEdit('variable.required')} />
</Flex>
)}
<Flex mt={5} alignItems={'center'}>
<Box w={'80px'}>{t('core.module.variable.variable name')}</Box>
<FormLabel w={'80px'}>{t('core.module.variable.variable name')}</FormLabel>
<Input
{...registerEdit('variable.label', {
required: t('core.module.variable.variable name is required')
@@ -187,7 +192,7 @@ const VariableEdit = ({
/>
</Flex>
<Flex mt={5} alignItems={'center'}>
<Box w={'80px'}>{t('core.module.variable.key')}</Box>
<FormLabel w={'80px'}>{t('core.module.variable.key')}</FormLabel>
<Input
{...registerEdit('variable.key', {
required: t('core.module.variable.key is required')
@@ -195,9 +200,9 @@ const VariableEdit = ({
/>
</Flex>
<Box mt={5} mb={2}>
<FormLabel mt={5} mb={2}>
{t('core.workflow.Variable.Variable type')}
</Box>
</FormLabel>
<MyRadio
gridGap={4}
gridTemplateColumns={'repeat(2,1fr)'}
@@ -220,9 +225,9 @@ const VariableEdit = ({
{variableType === VariableInputEnum.input && (
<>
<Box mt={5} mb={2}>
<FormLabel mt={5} mb={2}>
{t('core.module.variable.text max length')}
</Box>
</FormLabel>
<Box>
<NumberInput max={500} min={1} step={1} position={'relative'}>
<NumberInputField

View File

@@ -4,6 +4,7 @@ import MyIcon from '@fastgpt/web/components/common/Icon';
import ChatFunctionTip from './Tip';
import MyTextarea from '@/components/common/Textarea/MyTextarea';
import { useTranslation } from 'next-i18next';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const WelcomeTextConfig = (props: TextareaProps) => {
const { t } = useTranslation();
@@ -11,7 +12,7 @@ const WelcomeTextConfig = (props: TextareaProps) => {
<>
<Flex alignItems={'center'}>
<MyIcon name={'core/app/simpleMode/chat'} w={'20px'} />
<Box ml={2}>{t('core.app.Welcome Text')}</Box>
<FormLabel ml={2}>{t('core.app.Welcome Text')}</FormLabel>
<ChatFunctionTip type={'welcome'} />
</Flex>
<MyTextarea

View File

@@ -1,5 +1,5 @@
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { Box, Button, Flex, ModalBody, useDisclosure, Switch } from '@chakra-ui/react';
import React, { useMemo } from 'react';
import { useTranslation } from 'next-i18next';
@@ -7,6 +7,7 @@ import type { AppWhisperConfigType } from '@fastgpt/global/core/app/type.d';
import MyModal from '@fastgpt/web/components/common/MyModal';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import { defaultWhisperConfig } from '@fastgpt/global/core/app/constants';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const WhisperConfig = ({
isOpenAudio,
@@ -33,7 +34,7 @@ const WhisperConfig = ({
return (
<Flex alignItems={'center'}>
<MyIcon name={'core/app/simpleMode/whisper'} mr={2} w={'20px'} />
<Box fontWeight={'medium'}>{t('core.app.Whisper')}</Box>
<FormLabel>{t('core.app.Whisper')}</FormLabel>
<Box flex={1} />
<MyTooltip label={t('core.app.Config whisper')}>
<Button
@@ -54,10 +55,9 @@ const WhisperConfig = ({
>
<ModalBody px={[5, 16]} py={[4, 8]}>
<Flex justifyContent={'space-between'} alignItems={'center'}>
{t('core.app.whisper.Switch')}
<FormLabel>{t('core.app.whisper.Switch')}</FormLabel>
<Switch
isChecked={isOpenWhisper}
size={'lg'}
onChange={(e) => {
onChange({
...value,
@@ -68,12 +68,11 @@ const WhisperConfig = ({
</Flex>
{isOpenWhisper && (
<Flex mt={8} alignItems={'center'}>
{t('core.app.whisper.Auto send')}
<FormLabel>{t('core.app.whisper.Auto send')}</FormLabel>
<QuestionTip label={t('core.app.whisper.Auto send tip')} />
<Box flex={'1 0 0'} />
<Switch
isChecked={value.autoSend}
size={'lg'}
onChange={(e) => {
onChange({
...value,
@@ -86,12 +85,11 @@ const WhisperConfig = ({
{isOpenWhisper && isAutoSend && (
<>
<Flex mt={8} alignItems={'center'}>
{t('core.app.whisper.Auto tts response')}
<FormLabel>{t('core.app.whisper.Auto tts response')}</FormLabel>
<QuestionTip label={t('core.app.whisper.Auto tts response tip')} />
<Box flex={'1 0 0'} />
<Switch
isChecked={value.autoTTSResponse}
size={'lg'}
onChange={(e) => {
onChange({
...value,

View File

@@ -5,7 +5,7 @@ import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/ty
import NextLink from 'next/link';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useTranslation } from 'next-i18next';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import dynamic from 'next/dynamic';
import MyBox from '@fastgpt/web/components/common/MyBox';
import { SearchScoreTypeEnum, SearchScoreTypeMap } from '@fastgpt/global/core/dataset/constants';

View File

@@ -1,6 +1,6 @@
import React, { useMemo } from 'react';
import { Box, BoxProps } from '@chakra-ui/react';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useTranslation } from 'next-i18next';
import { getCollectionSourceAndOpen } from '@/web/core/dataset/hooks/readCollectionSource';
import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils';

View File

@@ -39,13 +39,15 @@ const SearchParamsTip = ({
>
<Table fontSize={'xs'} overflow={'overlay'}>
<Thead>
<Tr color={'myGray.600'}>
<Th>{t('core.dataset.search.search mode')}</Th>
<Th>{t('core.dataset.search.Max Tokens')}</Th>
<Th>{t('core.dataset.search.Min Similarity')}</Th>
{hasReRankModel && <Th>{t('core.dataset.search.ReRank')}</Th>}
<Th>{t('core.module.template.Query extension')}</Th>
{hasEmptyResponseMode && <Th>{t('core.dataset.search.Empty result response')}</Th>}
<Tr bg={'transparent !important'}>
<Th fontSize={'mini'}>{t('core.dataset.search.search mode')}</Th>
<Th fontSize={'mini'}>{t('core.dataset.search.Max Tokens')}</Th>
<Th fontSize={'mini'}>{t('core.dataset.search.Min Similarity')}</Th>
{hasReRankModel && <Th fontSize={'mini'}>{t('core.dataset.search.ReRank')}</Th>}
<Th fontSize={'mini'}>{t('core.module.template.Query extension')}</Th>
{hasEmptyResponseMode && (
<Th fontSize={'mini'}>{t('core.dataset.search.Empty result response')}</Th>
)}
</Tr>
</Thead>
<Tbody>

View File

@@ -12,7 +12,7 @@ import { SmallCloseIcon } from '@chakra-ui/icons';
import { Box, Flex, IconButton } from '@chakra-ui/react';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { streamFetch } from '@/web/common/api/fetch';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useUserStore } from '@/web/support/user/useUserStore';
import ChatBox from '@/components/ChatBox';
import type { ComponentRef, StartChatFnProps } from '@/components/ChatBox/type.d';
@@ -107,7 +107,7 @@ const ChatTest = (
transition={'.2s ease'}
>
<Flex py={4} px={5} whiteSpace={'nowrap'}>
<Box fontSize={'xl'} fontWeight={'bold'} flex={1}>
<Box fontSize={'lg'} fontWeight={'bold'} flex={1}>
{t('core.chat.Debug test')}
</Box>
<MyTooltip label={t('core.chat.Restart')}>

View File

@@ -47,7 +47,7 @@ enum TemplateTypeEnum {
'teamPlugin' = 'teamPlugin'
}
const sliderWidth = 380;
const sliderWidth = 390;
const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => {
const { t } = useTranslation();
@@ -138,6 +138,7 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => {
bottom={0}
w={`${sliderWidth}px`}
onClick={onClose}
fontSize={'sm'}
/>
<Flex
zIndex={3}
@@ -184,8 +185,6 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => {
<IconButton
size={'sm'}
icon={<MyIcon name={'common/backFill'} w={'14px'} color={'myGray.700'} />}
w={'26px'}
h={'26px'}
borderColor={'myGray.300'}
variant={'grayBase'}
aria-label={''}
@@ -212,6 +211,7 @@ const NodeTemplatesModal = ({ isOpen, onClose }: ModuleTemplateListProps) => {
_hover={{
color: 'primary.600'
}}
fontSize={'sm'}
onClick={() => router.push('/plugin/list')}
>
<Box></Box>
@@ -341,7 +341,7 @@ const RenderList = React.memo(function RenderList({
>
{item.label && (
<Flex>
<Box fontWeight={'bold'} flex={1}>
<Box fontSize={'sm'} fontWeight={'bold'} flex={1}>
{t(item.label)}
</Box>
</Flex>
@@ -405,11 +405,11 @@ const RenderList = React.memo(function RenderList({
>
<Avatar
src={template.avatar}
w={'30px'}
w={'1.7rem'}
objectFit={'contain'}
borderRadius={'0'}
/>
<Box color={'black'} ml={5} flex={'1 0 0'}>
<Box color={'black'} fontSize={'sm'} ml={5} flex={'1 0 0'}>
{t(template.name)}
</Box>
</Flex>
@@ -421,7 +421,7 @@ const RenderList = React.memo(function RenderList({
</Box>
</Box>
);
}, [formatTemplates, isPc, onAddNode, onClose, setCurrentParent, t, templates.length]);
}, [appT, formatTemplates, isPc, onAddNode, onClose, setCurrentParent, t, templates.length]);
return Render;
});

View File

@@ -74,7 +74,7 @@ const SelectAppModal = ({
})}
>
<Avatar src={app.avatar} w={['16px', '22px']} />
<Box fontWeight={'bold'} ml={1}>
<Box fontSize={'sm'} color={'myGray.900'} ml={1}>
{app.name}
</Box>
</Flex>

View File

@@ -21,9 +21,10 @@ const ButtonEdge = (props: EdgeProps) => {
sourcePosition,
targetPosition,
selected,
sourceHandleId,
source,
sourceHandleId,
target,
targetHandleId,
style
} = props;
@@ -86,12 +87,13 @@ const ButtonEdge = (props: EdgeProps) => {
const edgeColor = useMemo(() => {
const targetEdge = workflowDebugData?.runtimeEdges.find(
(edge) => edge.source === source && edge.target === target
(edge) => edge.sourceHandle === sourceHandleId && edge.targetHandle === targetHandleId
);
if (!targetEdge) {
if (highlightEdge) return '#3370ff';
return '#94B5FF';
}
console.log(targetEdge);
// debug mode
const colorMap = {
[RuntimeEdgeStatusEnum.active]: '#39CC83',
@@ -99,7 +101,7 @@ const ButtonEdge = (props: EdgeProps) => {
[RuntimeEdgeStatusEnum.skipped]: '#8A95A7'
};
return colorMap[targetEdge.status];
}, [highlightEdge, source, target, workflowDebugData?.runtimeEdges]);
}, [highlightEdge, sourceHandleId, targetHandleId, workflowDebugData?.runtimeEdges]);
const memoEdgeLabel = useMemo(() => {
const arrowTransform = (() => {

View File

@@ -219,7 +219,7 @@ export const useDebug = () => {
if (input.valueType === WorkflowIOValueTypeEnum.boolean) {
return (
<Box>
<Switch size={'lg'} {...register(input.key)} />
<Switch {...register(input.key)} />
</Box>
);
}

View File

@@ -28,7 +28,7 @@ import { useToast } from '@fastgpt/web/hooks/useToast';
import { useTranslation } from 'next-i18next';
import { FlowNodeItemType } from '@fastgpt/global/core/workflow/type/index.d';
import MyIcon from '@fastgpt/web/components/common/Icon';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { connectionLineStyle, defaultEdgeOptions } from '../constants';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useKeyboard } from './hooks/useKeyboard';

View File

@@ -9,7 +9,7 @@ import type { ClassifyQuestionAgentItemType } from '@fastgpt/global/core/workflo
import MyIcon from '@fastgpt/web/components/common/Icon';
import { NodeInputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import { useTranslation } from 'next-i18next';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io.d';
import { getNanoid } from '@fastgpt/global/common/string/tools';
import { SourceHandle } from './render/Handle';

View File

@@ -13,10 +13,11 @@ import type { ContextExtractAgentItemType } from '@fastgpt/global/core/workflow/
import { useForm } from 'react-hook-form';
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 MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import MySelect from '@fastgpt/web/components/common/MySelect';
import { fnValueTypeSelect } from '@/web/core/workflow/constants/dataType';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
export const defaultField: ContextExtractAgentItemType = {
valueType: 'string',
@@ -53,17 +54,15 @@ const ExtractFieldModal = ({
>
<ModalBody>
<Flex mt={2} alignItems={'center'}>
<Flex alignItems={'center'} flex={['0 0 80px', '0 0 100px']}>
{t('core.module.extract.Required')}
<MyTooltip label={t('core.module.extract.Required Description')} forceShow>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
<Flex alignItems={'center'} flex={['1 0 80px', '1 0 100px']}>
<FormLabel>{t('core.module.extract.Required')}</FormLabel>
<QuestionTip ml={1} label={t('core.module.extract.Required Description')}></QuestionTip>
</Flex>
<Switch {...register('required')} />
</Flex>
{required && (
<Flex mt={5} alignItems={'center'}>
<Box flex={['0 0 80px', '0 0 100px']}>{t('core.module.Default value')}</Box>
<FormLabel flex={['0 0 80px', '0 0 100px']}>{t('core.module.Default value')}</FormLabel>
<Input
bg={'myGray.50'}
placeholder={t('core.module.Default value placeholder')}
@@ -73,7 +72,7 @@ const ExtractFieldModal = ({
)}
<Flex alignItems={'center'} mt={5}>
<Box flex={['0 0 80px', '0 0 100px']}>{t('core.module.Data Type')}</Box>
<FormLabel flex={['0 0 80px', '0 0 100px']}>{t('core.module.Data Type')}</FormLabel>
<Box flex={'1 0 0'}>
<MySelect
list={fnValueTypeSelect}
@@ -86,7 +85,7 @@ const ExtractFieldModal = ({
</Flex>
<Flex mt={5} alignItems={'center'}>
<Box flex={['0 0 80px', '0 0 100px']}>{t('Field name')}</Box>
<FormLabel flex={['0 0 80px', '0 0 100px']}>{t('Field name')}</FormLabel>
<Input
bg={'myGray.50'}
placeholder="name/age/sql"
@@ -94,7 +93,9 @@ const ExtractFieldModal = ({
/>
</Flex>
<Flex mt={5} alignItems={'center'}>
<Box flex={['0 0 80px', '0 0 100px']}>{t('core.module.Field Description')}</Box>
<FormLabel flex={['0 0 80px', '0 0 100px']}>
{t('core.module.Field Description')}
</FormLabel>
<Input
bg={'myGray.50'}
placeholder={t('core.module.extract.Field Description Placeholder')}
@@ -104,10 +105,10 @@ const ExtractFieldModal = ({
{(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>
<FormLabel>
{t('core.module.extract.Enum Value')}({t('common.choosable')})
</FormLabel>
<QuestionTip ml={1} label={t('core.module.extract.Enum Description')}></QuestionTip>
</Flex>
<Textarea

View File

@@ -78,10 +78,12 @@ const NodeExtract = ({ data }: NodeProps<FlowNodeItemType>) => {
<Table bg={'white'}>
<Thead>
<Tr>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'} borderRadius={'none !important'}>
</Th>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'}></Th>
<Th bg={'myGray.50'} borderRadius={'none !important'}></Th>
</Tr>
</Thead>
<Tbody>

View File

@@ -26,7 +26,6 @@ import MyIcon from '@fastgpt/web/components/common/Icon';
import { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io.d';
import { useToast } from '@fastgpt/web/hooks/useToast';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import JSONEditor from '@fastgpt/web/components/common/Textarea/JsonEditor';
import { formatEditorVariablePickerIcon } from '@fastgpt/global/core/workflow/utils';
import { EditorVariablePickerType } from '@fastgpt/web/components/common/Textarea/PromptEditor/type';
@@ -40,6 +39,7 @@ import { WorkflowContext } from '../../../context';
import { getWorkflowGlobalVariables } from '@/web/core/workflow/utils';
import { useMemoizedFn } from 'ahooks';
import { AppContext } from '@/web/core/app/context/appContext';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
const CurlImportModal = dynamic(() => import('./CurlImportModal'));
export const HttpHeaders = [
@@ -305,9 +305,10 @@ export function RenderHttpProps({
<Box>
<Flex alignItems={'center'} mb={2} fontWeight={'medium'} color={'myGray.600'}>
{t('core.module.Http request props')}
<MyTooltip label={t('core.module.http.Props tip', { variable: variableText })}>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
<QuestionTip
ml={1}
label={t('core.module.http.Props tip', { variable: variableText })}
></QuestionTip>
</Flex>
<Tabs
list={[
@@ -468,89 +469,97 @@ const RenderForm = ({
const Render = useMemo(() => {
return (
<TableContainer overflowY={'visible'} overflowX={'unset'}>
<Table>
<Thead>
<Tr>
<Th px={2}>{t('core.module.http.Props name')}</Th>
<Th px={2}>{t('core.module.http.Props value')}</Th>
</Tr>
</Thead>
<Tbody>
{list.map((item, index) => (
<Tr key={`${input.key}${index}`}>
<Box mt={2} borderRadius={'md'} overflow={'hidden'} borderWidth={'1px'} borderBottom={'none'}>
<TableContainer overflowY={'visible'} overflowX={'unset'}>
<Table>
<Thead>
<Tr>
<Th px={2} borderBottomLeftRadius={'none !important'}>
{t('core.module.http.Props name')}
</Th>
<Th px={2} borderBottomRadius={'none !important'}>
{t('core.module.http.Props value')}
</Th>
</Tr>
</Thead>
<Tbody>
{list.map((item, index) => (
<Tr key={`${input.key}${index}`}>
<Td p={0} w={'150px'}>
<HttpInput
hasVariablePlugin={false}
hasDropDownPlugin={tabType === TabEnum.headers}
setDropdownValue={(value) => {
handleKeyChange(index, value);
setUpdateTrigger((prev) => !prev);
}}
placeholder={t('core.module.http.Props name')}
value={item.key}
variables={leftVariables}
onBlur={(val) => {
handleKeyChange(index, val);
}}
updateTrigger={updateTrigger}
/>
</Td>
<Td p={0}>
<Box display={'flex'} alignItems={'center'}>
<HttpInput
placeholder={t('core.module.http.Props value')}
value={item.value}
variables={variables}
onBlur={(val) => {
setList((prevList) =>
prevList.map((item, i) =>
i === index ? { ...item, value: val } : item
)
);
setShouldUpdateNode(true);
}}
/>
<MyIcon
name={'delete'}
cursor={'pointer'}
_hover={{ color: 'red.600' }}
w={'14px'}
onClick={() => {
setList((prevlist) => prevlist.filter((val) => val.key !== item.key));
setShouldUpdateNode(true);
}}
/>
</Box>
</Td>
</Tr>
))}
<Tr>
<Td p={0} w={'150px'}>
<HttpInput
hasVariablePlugin={false}
hasDropDownPlugin={tabType === TabEnum.headers}
setDropdownValue={(value) => {
handleKeyChange(index, value);
setDropdownValue={(val) => {
handleAddNewProps(val);
setUpdateTrigger((prev) => !prev);
}}
placeholder={t('core.module.http.Props name')}
value={item.key}
placeholder={t('core.module.http.Add props')}
value={''}
variables={leftVariables}
onBlur={(val) => {
handleKeyChange(index, val);
}}
updateTrigger={updateTrigger}
onBlur={(val) => {
handleAddNewProps(val);
setUpdateTrigger((prev) => !prev);
}}
/>
</Td>
<Td p={0}>
<Box display={'flex'} alignItems={'center'}>
<HttpInput
placeholder={t('core.module.http.Props value')}
value={item.value}
variables={variables}
onBlur={(val) => {
setList((prevList) =>
prevList.map((item, i) => (i === index ? { ...item, value: val } : item))
);
setShouldUpdateNode(true);
}}
/>
<MyIcon
name={'delete'}
cursor={'pointer'}
_hover={{ color: 'red.600' }}
w={'14px'}
onClick={() => {
setList((prevlist) => prevlist.filter((val) => val.key !== item.key));
setShouldUpdateNode(true);
}}
/>
<HttpInput />
</Box>
</Td>
</Tr>
))}
<Tr>
<Td p={0} w={'150px'}>
<HttpInput
hasVariablePlugin={false}
hasDropDownPlugin={tabType === TabEnum.headers}
setDropdownValue={(val) => {
handleAddNewProps(val);
setUpdateTrigger((prev) => !prev);
}}
placeholder={t('core.module.http.Add props')}
value={''}
variables={leftVariables}
updateTrigger={updateTrigger}
onBlur={(val) => {
handleAddNewProps(val);
setUpdateTrigger((prev) => !prev);
}}
/>
</Td>
<Td p={0}>
<Box display={'flex'} alignItems={'center'}>
<HttpInput />
</Box>
</Td>
</Tr>
</Tbody>
</Table>
</TableContainer>
</Tbody>
</Table>
</TableContainer>
</Box>
);
}, [
handleAddNewProps,

View File

@@ -65,11 +65,8 @@ const ListItem = ({
>
<Container w={snapshot.isDragging ? '' : 'full'} className="nodrag">
<Flex mb={4} alignItems={'center'}>
<DragIcon
visibility={ifElseList.length > 1 ? 'visible' : 'hidden'}
provided={provided}
/>
<Box color={'black'} fontSize={'lg'} ml={2}>
{ifElseList.length > 1 && <DragIcon provided={provided} />}
<Box color={'black'} fontSize={'md'} ml={2}>
{getElseIFLabel(conditionIndex)}
</Box>
{conditionItem.list?.length > 1 && (

View File

@@ -91,7 +91,7 @@ const NodeIfElse = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
<Container position={'relative'}>
<Flex alignItems={'center'}>
<Box color={'black'} fontSize={'lg'} ml={2}>
<Box color={'black'} fontSize={'md'} ml={2}>
{IfElseResultEnum.ELSE}
</Box>
<SourceHandle

View File

@@ -129,7 +129,6 @@ function QuestionGuide({ chatConfig: { questionGuide = false }, setAppDetail }:
return (
<QGSwitch
isChecked={questionGuide}
size={'md'}
onChange={(e) => {
const value = e.target.checked;
setAppDetail((state) => ({

View File

@@ -224,7 +224,6 @@ const NodeVariableUpdate = ({ data, selected }: NodeProps<FlowNodeItemType>) =>
if (valueType === WorkflowIOValueTypeEnum.boolean) {
return (
<Switch
size="lg"
defaultChecked={updateItem.value?.[1] === 'true'}
onChange={(e) => handleUpdate(String(e.target.checked))}
/>

View File

@@ -26,6 +26,7 @@ import { NodeInputKeyEnum, WorkflowIOValueTypeEnum } from '@fastgpt/global/core/
import dynamic from 'next/dynamic';
import MyNumberInput from '@fastgpt/web/components/common/Input/NumberInput/index';
import { useI18n } from '@/web/context/I18n';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const JsonEditor = dynamic(() => import('@fastgpt/web/components/common/Textarea/JsonEditor'));
const EmptyTip = dynamic(() => import('@fastgpt/web/components/common/EmptyTip'));
@@ -304,7 +305,7 @@ const FieldEditModal = ({
<Stack flex={1} gap={5}>
{showInputTypeSelect && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Input Type')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Input Type')}</FormLabel>
<Box flex={1}>
<MySelect
list={inputTypeList}
@@ -320,7 +321,7 @@ const FieldEditModal = ({
)}
{showValueTypeSelect && !showInputTypeSelect && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Data Type')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Data Type')}</FormLabel>
<Box flex={1}>
<MySelect
w={'full'}
@@ -336,7 +337,7 @@ const FieldEditModal = ({
)}
{showKeyInput && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Field Name')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Field Name')}</FormLabel>
<Input
bg={'myGray.50'}
placeholder="appointment/sql"
@@ -348,9 +349,9 @@ const FieldEditModal = ({
)}
{showDescriptionInput && (
<Box alignItems={'flex-start'}>
<Box flex={'0 0 70px'} mb={'1px'}>
<FormLabel flex={'0 0 70px'} mb={'1px'}>
{t('core.module.Field Description')}
</Box>
</FormLabel>
<Textarea
bg={'myGray.50'}
placeholder={
@@ -366,18 +367,18 @@ const FieldEditModal = ({
{showInputTypeSelect && (
<Stack flex={1} gap={5}>
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{workflowT('Field required')}</Box>
<FormLabel flex={'0 0 70px'}>{workflowT('Field required')}</FormLabel>
<Switch {...register('required')} />
</Flex>
{showToolInput && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}></Box>
<FormLabel flex={'0 0 70px'}></FormLabel>
<Switch {...register('isToolInput')} />
</Flex>
)}
{showValueTypeSelect && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Data Type')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Data Type')}</FormLabel>
<Box flex={1}>
<MySelect
w={'full'}
@@ -393,7 +394,7 @@ const FieldEditModal = ({
)}
{showDefaultValue && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Default Value')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Default Value')}</FormLabel>
{inputType === FlowNodeInputTypeEnum.numberInput && (
<Input
bg={'myGray.50'}
@@ -430,7 +431,7 @@ const FieldEditModal = ({
)}
{showMaxLenInput && (
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Max Length')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Max Length')}</FormLabel>
<MyNumberInput
flex={'1 0 0'}
bg={'myGray.50'}
@@ -447,7 +448,7 @@ const FieldEditModal = ({
{showMinMaxInput && (
<>
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Max Value')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Max Value')}</FormLabel>
<MyNumberInput
flex={'1 0 0'}
bg={'myGray.50'}
@@ -459,7 +460,7 @@ const FieldEditModal = ({
/>
</Flex>
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Min Value')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Min Value')}</FormLabel>
<MyNumberInput
flex={'1 0 0'}
bg={'myGray.50'}
@@ -475,13 +476,13 @@ const FieldEditModal = ({
{showDynamicInput && (
<Stack gap={5}>
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Input Type')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Input Type')}</FormLabel>
<Box flex={1} fontWeight={'bold'}>
{t('core.workflow.inputType.Reference')}
</Box>
</Flex>
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.module.Data Type')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.module.Data Type')}</FormLabel>
<Box flex={1}>
<MySelect
list={dataTypeSelectList}
@@ -496,7 +497,7 @@ const FieldEditModal = ({
</Box>
</Flex>
<Flex alignItems={'center'}>
<Box flex={'0 0 70px'}>{t('core.workflow.inputType.Required')}</Box>
<FormLabel flex={'0 0 70px'}>{t('core.workflow.inputType.Required')}</FormLabel>
<Box flex={1}>
<Switch {...register('dynamicParamDefaultValue.required')} />
</Box>

View File

@@ -1,4 +1,4 @@
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { Box, BoxProps } from '@chakra-ui/react';
import { NodeOutputKeyEnum } from '@fastgpt/global/core/workflow/constants';
import { useTranslation } from 'next-i18next';

View File

@@ -23,7 +23,7 @@ import { WorkflowContext } from '../../../context';
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 MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { useSystemStore } from '@/web/common/system/useSystemStore';
type Props = FlowNodeItemType & {
@@ -140,7 +140,7 @@ const NodeCard = (props: Props) => {
{/* avatar and name */}
<Flex alignItems={'center'}>
<Avatar src={avatar} borderRadius={'0'} objectFit={'contain'} w={'30px'} h={'30px'} />
<Box ml={3} fontSize={'lg'} fontWeight={'medium'}>
<Box ml={3} fontSize={'md'} fontWeight={'medium'}>
{t(name)}
</Box>
{!menuForbid?.rename && (

View File

@@ -2,8 +2,7 @@ import { FlowNodeInputItemType } from '@fastgpt/global/core/workflow/type/io.d';
import React, { useCallback, useMemo, useState } from 'react';
import { useTranslation } from 'next-i18next';
import { Box, Flex } from '@chakra-ui/react';
import MyTooltip from '@/components/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import NodeInputSelect from '@fastgpt/web/components/core/workflow/NodeInputSelect';
import MyIcon from '@fastgpt/web/components/common/Icon';
@@ -14,6 +13,7 @@ import { FlowNodeInputTypeEnum } from '@fastgpt/global/core/workflow/node/consta
import ValueTypeLabel from '../ValueTypeLabel';
import { useContextSelector } from 'use-context-selector';
import { WorkflowContext } from '@/components/core/workflow/context';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
const FieldEditModal = dynamic(() => import('../FieldEditModal'));
type Props = {
@@ -62,19 +62,20 @@ const InputLabel = ({ nodeId, input }: Props) => {
return (
<Flex className="nodrag" cursor={'default'} alignItems={'center'} position={'relative'}>
<Box position={'relative'} fontWeight={'medium'} color={'myGray.600'}>
<Flex
alignItems={'center'}
position={'relative'}
fontWeight={'medium'}
color={'myGray.600'}
>
{required && (
<Box position={'absolute'} left={-2} top={-1} color={'red.600'}>
*
</Box>
)}
{t(label)}
{description && (
<MyTooltip label={t(description)} forceShow>
<QuestionOutlineIcon display={['none', 'inline']} ml={1} />
</MyTooltip>
)}
</Box>
{description && <QuestionTip ml={1} label={t(description)}></QuestionTip>}
</Flex>
{/* value type */}
{renderType === FlowNodeInputTypeEnum.reference && <ValueTypeLabel valueType={valueType} />}
{/* edit config */}

View File

@@ -85,7 +85,7 @@ const SelectDatasetRender = ({ inputs = [], item, nodeId }: RenderInputProps) =>
w={0}
className="textEllipsis"
fontWeight={'bold'}
fontSize={['md', 'lg', 'xl']}
fontSize={['md', 'lg']}
>
{item.name}
</Box>

View File

@@ -6,12 +6,11 @@ import { useForm } from 'react-hook-form';
import { PromptTemplateItem } from '@fastgpt/global/core/ai/type';
import { useTranslation } from 'next-i18next';
import { ModalBody } from '@chakra-ui/react';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import {
Prompt_QuotePromptList,
Prompt_QuoteTemplateList
} from '@fastgpt/global/core/ai/prompt/AIChat';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import PromptEditor from '@fastgpt/web/components/common/Textarea/PromptEditor';
import PromptTemplate from '@/components/PromptTemplate';
import { NodeInputKeyEnum, WorkflowIOValueTypeEnum } from '@fastgpt/global/core/workflow/constants';
@@ -23,6 +22,8 @@ import { WorkflowContext } from '@/components/core/workflow/context';
import { getWorkflowGlobalVariables } from '@/web/core/workflow/utils';
import { useCreation } from 'ahooks';
import { AppContext } from '@/web/core/app/context/appContext';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
const LabelStyles: BoxProps = {
fontSize: ['sm', 'md']
@@ -178,18 +179,17 @@ const SettingQuotePrompt = (props: RenderInputProps) => {
<ModalBody>
<Box>
<Flex {...LabelStyles} mb={1}>
{t('core.app.Quote templates')}
<MyTooltip
<FormLabel>{t('core.app.Quote templates')}</FormLabel>
<QuestionTip
ml={1}
label={t('template.Quote Content Tip', {
default: Prompt_QuoteTemplateList[0].value
})}
forceShow
>
<QuestionOutlineIcon display={['none', 'inline']} ml={1} />
</MyTooltip>
></QuestionTip>
<Box flex={1} />
<Box
{...selectTemplateBtn}
fontSize={'sm'}
onClick={() =>
setSelectTemplateData({
title: t('core.app.Select quote template'),
@@ -216,15 +216,13 @@ const SettingQuotePrompt = (props: RenderInputProps) => {
</Box>
<Box mt={4}>
<Flex {...LabelStyles} mb={1}>
{t('core.app.Quote prompt')}
<MyTooltip
<FormLabel>{t('core.app.Quote prompt')}</FormLabel>
<QuestionTip
ml={1}
label={t('template.Quote Prompt Tip', {
default: Prompt_QuotePromptList[0].value
})}
forceShow
>
<QuestionOutlineIcon display={['none', 'inline']} ml={1} />
</MyTooltip>
></QuestionTip>
</Flex>
<PromptEditor
variables={quotePromptVariables}

View File

@@ -51,15 +51,17 @@ const VariableTable = ({
borderRadius={'md'}
overflow={'hidden'}
borderWidth={'1px'}
borderBottom="none"
borderBottom={'none'}
>
<TableContainer>
<Table bg={'white'}>
<Thead>
<Tr>
<Th>{t('core.module.variable.variable name')}</Th>
<Th borderBottomLeftRadius={'none !important'}>
{t('core.module.variable.variable name')}
</Th>
<Th>{t('core.workflow.Value type')}</Th>
<Th></Th>
<Th borderBottomRightRadius={'none !important'}></Th>
</Tr>
</Thead>
<Tbody>

View File

@@ -105,7 +105,7 @@ const PublishHistoriesSlider = () => {
<Button
mx={'20px'}
variant={'whitePrimary'}
mb={1}
mb={2}
isDisabled={!selectedHistoryId}
onClick={() => {
setSelectedHistoryId(undefined);
@@ -125,7 +125,7 @@ const PublishHistoriesSlider = () => {
<Flex
key={data.index}
alignItems={'center'}
py={4}
py={3}
px={3}
borderRadius={'md'}
cursor={'pointer'}

View File

@@ -15,10 +15,6 @@ import {
useTheme,
Link,
Input,
MenuList,
MenuItem,
MenuButton,
Menu,
IconButton
} from '@chakra-ui/react';
import {
@@ -31,7 +27,7 @@ import type { EditApiKeyProps } from '@/global/support/openapi/api.d';
import { useQuery, useMutation } from '@tanstack/react-query';
import { useLoading } from '@fastgpt/web/hooks/useLoading';
import dayjs from 'dayjs';
import { AddIcon, QuestionOutlineIcon } from '@chakra-ui/icons';
import { AddIcon } from '@chakra-ui/icons';
import { useCopyData } from '@/web/common/hooks/useCopyData';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useTranslation } from 'next-i18next';
@@ -39,11 +35,12 @@ import MyIcon from '@fastgpt/web/components/common/Icon';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { useForm } from 'react-hook-form';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import MyTooltip from '@/components/MyTooltip';
import { getDocPath } from '@/web/common/system/doc';
import MyMenu from '@fastgpt/web/components/common/MyMenu';
import { useConfirm } from '@fastgpt/web/hooks/useConfirm';
import { useI18n } from '@/web/context/I18n';
import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
type EditProps = EditApiKeyProps & { _id?: string };
const defaultEditData: EditProps = {
@@ -91,7 +88,7 @@ const ApiKeyTable = ({ tips, appId }: { tips: string; appId?: string }) => {
<Box display={['block', 'flex']} py={[0, 3]} px={5} alignItems={'center'}>
<Box flex={1}>
<Flex alignItems={'flex-end'}>
<Box fontSize={['md', 'xl']} fontWeight={'bold'}>
<Box color={'myGray.900'} fontSize={'lg'}>
{t('support.openapi.Api manager')}
</Box>
{feConfigs?.docUrl && (
@@ -100,18 +97,19 @@ const ApiKeyTable = ({ tips, appId }: { tips: string; appId?: string }) => {
target={'_blank'}
ml={1}
color={'primary.500'}
fontSize={'sm'}
>
{t('common.Read document')}
</Link>
)}
</Flex>
<Box fontSize={'sm'} color={'myGray.600'}>
<Box fontSize={'xs'} color={'myGray.600'}>
{tips}
</Box>
</Box>
<Flex
mt={[2, 0]}
bg={'myWhite.600'}
bg={'myGray.100'}
py={2}
px={4}
borderRadius={'md'}
@@ -119,10 +117,10 @@ const ApiKeyTable = ({ tips, appId }: { tips: string; appId?: string }) => {
userSelect={'none'}
onClick={() => copyData(baseUrl, t('support.openapi.Copy success'))}
>
<Box border={theme.borders.md} px={2} borderRadius={'md'} fontSize={'sm'}>
<Box border={theme.borders.md} px={2} borderRadius={'md'} fontSize={'xs'}>
{t('support.openapi.Api baseurl')}
</Box>
<Box ml={2} color={'myGray.900'} fontSize={['sm', 'md']}>
<Box ml={2} fontSize={'sm'}>
{baseUrl}
</Box>
</Flex>
@@ -200,21 +198,25 @@ const ApiKeyTable = ({ tips, appId }: { tips: string; appId?: string }) => {
}
menuList={[
{
label: t('common.Edit'),
icon: 'edit',
onClick: () =>
setEditData({
_id,
name,
limit,
appId
})
},
{
label: t('common.Delete'),
icon: 'delete',
type: 'danger',
onClick: () => openConfirm(() => onclickRemove(_id))()
children: [
{
label: t('common.Edit'),
icon: 'edit',
onClick: () =>
setEditData({
_id,
name,
limit,
appId
})
},
{
label: t('common.Delete'),
icon: 'delete',
type: 'danger',
onClick: () => openConfirm(() => onclickRemove(_id))()
}
]
}
]}
/>
@@ -248,10 +250,8 @@ const ApiKeyTable = ({ tips, appId }: { tips: string; appId?: string }) => {
iconSrc="/imgs/modal/key.svg"
title={
<Box>
<Box fontWeight={'bold'} fontSize={'xl'}>
{t('support.openapi.New api key')}
</Box>
<Box fontSize={'sm'} color={'myGray.600'}>
<Box fontWeight={'bold'}>{t('support.openapi.New api key')}</Box>
<Box fontSize={'xs'} color={'myGray.600'}>
{t('support.openapi.New api key tip')}
</Box>
</Box>
@@ -332,7 +332,7 @@ function EditKeyModal({
>
<ModalBody>
<Flex alignItems={'center'}>
<Box flex={'0 0 90px'}>{t('Name')}:</Box>
<FormLabel flex={'0 0 90px'}>{t('Name')}</FormLabel>
<Input
placeholder={publishT('key alias') || 'key alias'}
maxLength={20}
@@ -344,12 +344,10 @@ function EditKeyModal({
{feConfigs?.isPlus && (
<>
<Flex alignItems={'center'} mt={4}>
<Flex flex={'0 0 90px'} alignItems={'center'}>
{t('support.outlink.Max usage points')}:
<MyTooltip label={t('support.outlink.Max usage points tip')}>
<QuestionOutlineIcon ml={1} />
</MyTooltip>
</Flex>
<FormLabel display={'flex'} flex={'0 0 90px'} alignItems={'center'}>
{t('support.outlink.Max usage points')}
<QuestionTip ml={1} label={t('support.outlink.Max usage points tip')}></QuestionTip>
</FormLabel>
<Input
{...register('limit.maxUsagePoints', {
min: -1,
@@ -360,9 +358,7 @@ function EditKeyModal({
/>
</Flex>
<Flex alignItems={'center'} mt={4}>
<Flex flex={'0 0 90px'} alignItems={'center'}>
{t('common.Expired Time')}:
</Flex>
<FormLabel flex={'0 0 90px'}>{t('common.Expired Time')}</FormLabel>
<Input
type="datetime-local"
defaultValue={

View File

@@ -9,6 +9,8 @@ import { Permission } from '@fastgpt/global/support/permission/controller';
const PermissionIconText = ({
permission,
defaultPermission,
w = '1rem',
fontSize = 'mini',
...props
}: {
permission?: `${PermissionTypeEnum}`;
@@ -25,9 +27,9 @@ const PermissionIconText = ({
}, [defaultPermission, permission]);
return PermissionTypeMap[per] ? (
<Flex alignItems={'center'} {...props}>
<MyIcon name={PermissionTypeMap[per]?.iconLight as any} w={'14px'} />
<Box ml={'2px'} lineHeight={1}>
<Flex alignItems={'center'} fontSize={fontSize} {...props}>
<MyIcon name={PermissionTypeMap[per]?.iconLight as any} w={w} />
<Box ml={'2px'} lineHeight={1} fontSize={'xs'}>
{t(PermissionTypeMap[per]?.label)}
</Box>
</Flex>

View File

@@ -93,13 +93,12 @@ export function AddMemberModal({ onClose }: AddModalPropsType) {
p="4"
minH="200px"
>
<InputGroup alignItems="center" h="32px" my="2" py="1">
<InputGroup alignItems="center" size="sm">
<InputLeftElement>
<MyIcon name="common/searchLight" w="16px" color={'myGray.500'} />
</InputLeftElement>
<Input
placeholder="搜索用户名"
fontSize="lg"
bgColor="myGray.50"
onChange={(e) => setSearchText(e.target.value)}
/>
@@ -128,7 +127,6 @@ export function AddMemberModal({ onClose }: AddModalPropsType) {
}}
>
<Checkbox
size="lg"
mr="3"
isChecked={selectedMemberIdList.includes(member.tmbId)}
onChange={onChange}
@@ -167,9 +165,7 @@ export function AddMemberModal({ onClose }: AddModalPropsType) {
_notLast={{ mb: 2 }}
>
<Avatar src={member.avatar} w="24px" />
<Box w="full" fontSize="lg">
{member.memberName}
</Box>
<Box w="full">{member.memberName}</Box>
<MyIcon
name="common/closeLight"
w="16px"
@@ -202,7 +198,7 @@ export function AddMemberModal({ onClose }: AddModalPropsType) {
h={'32px'}
>
{perLabel}
<ChevronDownIcon fontSize={'lg'} />
<ChevronDownIcon fontSize={'md'} />
</Flex>
}
onChange={(v) => setSelectedPermission(v)}

View File

@@ -64,10 +64,13 @@ function ManageModal({ onClose }: ManageModalProps) {
<Tr>
<Th border="none"></Th>
<Th border="none"></Th>
<Th border="none"></Th>
<Th border="none" w={'40px'}>
</Th>
</Tr>
</Thead>
<Tbody>
<Tr h={'10px'} />
{collaboratorList?.map((item) => {
return (
<Tr

View File

@@ -143,6 +143,7 @@ function PermissionSelect({
}
zIndex={99}
overflowY={'auto'}
whiteSpace={'pre-wrap'}
>
{/* The list of single select permissions */}
{permissionSelectList.singleCheckBoxList.map((item) => {
@@ -164,12 +165,14 @@ function PermissionSelect({
: {})}
{...MenuStyle}
onClick={change}
maxW={['70vw', '300px']}
maxW={['70vw', '260px']}
>
<Radio size="lg" isChecked={selectedSingleValue === item.value} />
<Radio isChecked={selectedSingleValue === item.value} />
<Box ml={4}>
<Box>{item.name}</Box>
<Box color={'myGray.500'}>{item.description}</Box>
<Box color={'myGray.500'} fontSize={'mini'}>
{item.description}
</Box>
</Box>
</Flex>
);

View File

@@ -34,7 +34,7 @@ function MemberManger() {
return (
<>
<Flex alignItems="center" flexDirection="row" justifyContent="space-between" w="full">
<Box></Box>
<Box fontSize={'sm'}></Box>
<Flex flexDirection="row" gap="2">
<Button
size="sm"

View File

@@ -97,9 +97,9 @@ function TeamCard() {
py={4}
borderBottom={'1.5px solid'}
borderBottomColor={'myGray.100'}
mb={3}
mb={2}
>
<Box fontSize={['lg', 'xl']} fontWeight={'bold'} alignItems={'center'}>
<Box fontSize={['sm', 'md']} fontWeight={'bold'} alignItems={'center'}>
{userInfo?.team.teamName}
</Box>
{userInfo?.team.role === TeamMemberRoleEnum.owner && (

View File

@@ -1,4 +1,4 @@
import { Box, Button, Flex, IconButton } from '@chakra-ui/react';
import { Box, Button, Flex, IconButton, Text } from '@chakra-ui/react';
import Avatar from '@/components/Avatar';
import { useTranslation } from 'next-i18next';
import MyIcon from '@fastgpt/web/components/common/Icon';
@@ -28,7 +28,7 @@ function TeamList() {
h={'40px'}
borderBottom={'1.5px solid rgba(0, 0, 0, 0.05)'}
>
<Box flex={['0 0 auto', 1]} fontWeight={'bold'} fontSize={['md', 'lg']}>
<Box flex={['0 0 auto', 1]} fontSize={['sm', 'md']}>
{t('common.Team')}
</Box>
{/* if there is no team */}
@@ -73,6 +73,7 @@ function TeamList() {
<Box
flex={'1 0 0'}
w={0}
fontSize={'sm'}
{...(team.role === TeamMemberRoleEnum.owner
? {
fontWeight: 'bold'

View File

@@ -8,7 +8,7 @@ import { getErrText } from '@fastgpt/global/common/error/utils';
import { useRequest } from '@fastgpt/web/hooks/useRequest';
import MyModal from '@fastgpt/web/components/common/MyModal';
import { Box, Button, Flex, Input, ModalBody, ModalFooter } from '@chakra-ui/react';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import Avatar from '@/components/Avatar';
import { postCreateTeam, putUpdateTeam } from '@/web/support/user/team/api';
import { CreateTeamProps } from '@fastgpt/global/support/user/team/controller.d';

View File

@@ -21,7 +21,9 @@ function MemberTable() {
const { t } = useTranslation();
const { members, refetchMembers } = useContextSelector(TeamModalContext, (v) => v);
const { ConfirmModal: ConfirmRemoveMemberModal, openConfirm: openRemoveMember } = useConfirm({});
const { ConfirmModal: ConfirmRemoveMemberModal, openConfirm: openRemoveMember } = useConfirm({
type: 'delete'
});
const { mutate: onRemoveMember, isLoading: isRemovingMember } = useRequest({
mutationFn: delRemoveMember,
@@ -34,14 +36,14 @@ function MemberTable() {
return (
<MyBox isLoading={isRemovingMember}>
<TableContainer overflow={'unset'}>
<TableContainer overflow={'unset'} fontSize={'sm'}>
<Table overflow={'unset'}>
<Thead bg={'myWhite.400'}>
<Tr>
<Th>{t('common.Username')}</Th>
<Th borderRadius={'none !important'}>{t('common.Username')}</Th>
<Th>{t('user.team.Role')}</Th>
<Th>{t('common.Status')}</Th>
<Th>{t('common.Action')}</Th>
<Th borderRadius={'none !important'}>{t('common.Action')}</Th>
</Tr>
</Thead>
<Tbody>
@@ -67,36 +69,35 @@ function MemberTable() {
Button={
<MenuButton
_hover={{
bg: 'myWhite.600'
color: 'primary.600'
}}
borderRadius={'md'}
px={2}
py={1}
lineHeight={1}
>
<MyIcon
name={'edit'}
cursor={'pointer'}
w="14px"
_hover={{ color: 'primary.500' }}
/>
<MyIcon name={'edit'} cursor={'pointer'} w="1rem" />
</MenuButton>
}
menuList={[
{
label: t('user.team.Remove Member Tip'),
onClick: () =>
openRemoveMember(
() =>
onRemoveMember({
teamId: item.teamId,
memberId: item.tmbId
}),
undefined,
t('user.team.Remove Member Confirm Tip', {
username: item.memberName
})
)()
children: [
{
label: t('user.team.Remove Member Tip'),
onClick: () =>
openRemoveMember(
() =>
onRemoveMember({
teamId: item.teamId,
memberId: item.tmbId
}),
undefined,
t('user.team.Remove Member Confirm Tip', {
username: item.memberName
})
)()
}
]
}
]}
/>

View File

@@ -78,13 +78,13 @@ function AddManagerModal({ onClose, onSuccess }: { onClose: () => void; onSucces
borderColor="myGray.200"
>
<Flex flexDirection="column" p="4">
<InputGroup alignItems="center" h="32px" my="2" py="1">
<InputGroup alignItems="center" size={'sm'}>
<InputLeftElement>
<MyIcon name="common/searchLight" w="16px" color={'myGray.500'} />
</InputLeftElement>
<Input
placeholder="搜索用户名"
fontSize="lg"
fontSize="sm"
bg={'myGray.50'}
onChange={(e) => {
setSearchKey(e.target.value);
@@ -98,7 +98,6 @@ function AddManagerModal({ onClose, onSuccess }: { onClose: () => void; onSucces
py="2"
px={3}
borderRadius={'md'}
fontSize="lg"
alignItems="center"
key={member.tmbId}
cursor={'pointer'}
@@ -112,8 +111,8 @@ function AddManagerModal({ onClose, onSuccess }: { onClose: () => void; onSucces
}
}}
>
<Checkbox isChecked={selected.includes(member)} size="lg" />
<Avatar src={member.avatar} w="24px" />
<Checkbox isChecked={selected.includes(member)} />
<Avatar ml={2} src={member.avatar} w="1.5rem" />
{member.memberName}
</Flex>
);
@@ -135,11 +134,13 @@ function AddManagerModal({ onClose, onSuccess }: { onClose: () => void; onSucces
_hover={{ bg: 'myGray.50' }}
_notLast={{ mb: 2 }}
>
<Avatar src={member.avatar} w="24px" />
<Box w="full" fontSize="lg">
{member.memberName}
</Box>
<CloseButton
<Avatar src={member.avatar} w="1.5rem" />
<Box w="full">{member.memberName}</Box>
<MyIcon
name={'common/closeLight'}
w={'1rem'}
cursor={'pointer'}
_hover={{ color: 'red.600' }}
onClick={() =>
setSelected([...selected.filter((item) => item.tmbId != member.tmbId)])
}

View File

@@ -47,7 +47,7 @@ function PermissionManage() {
justifyContent={'space-between'}
>
<Flex>
<Box fontSize={['md', 'lg']} fontWeight={'bold'} alignItems={'center'}>
<Box fontSize={['sm', 'md']} fontWeight={'bold'} alignItems={'center'}>
{t('user.team.role.Admin')}
</Box>
<Box

View File

@@ -2,7 +2,7 @@ import React from 'react';
import { Box, Button, Flex, Image, useDisclosure } from '@chakra-ui/react';
import { useUserStore } from '@/web/support/user/useUserStore';
import { useTranslation } from 'next-i18next';
import MyTooltip from '@/components/MyTooltip';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import dynamic from 'next/dynamic';
import { useSystemStore } from '@/web/common/system/useSystemStore';
import { useToast } from '@fastgpt/web/hooks/useToast';

View File

@@ -6,9 +6,9 @@ import { Box, Flex, Grid } from '@chakra-ui/react';
import MyIcon from '@fastgpt/web/components/common/Icon';
import { useTranslation } from 'next-i18next';
import MyTooltip from '@fastgpt/web/components/common/MyTooltip';
import { QuestionOutlineIcon } from '@chakra-ui/icons';
import { useRouter } from 'next/router';
import { AI_POINT_USAGE_CARD_ROUTE } from '@/web/support/wallet/sub/constants';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
const StandardPlanContentList = ({
level,
@@ -43,7 +43,7 @@ const StandardPlanContentList = ({
}, [subPlans?.standard, level, mode]);
return planContent ? (
<Grid gap={4}>
<Grid gap={4} fontSize={'sm'}>
<Flex alignItems={'center'}>
<MyIcon name={'price/right'} w={'16px'} mr={3} />
<Box color={'myGray.600'}>
@@ -92,14 +92,13 @@ const StandardPlanContentList = ({
amount: planContent.totalPoints
})}
</Box>
<MyTooltip label={t('support.wallet.subscription.AI points click to read tip')}>
<QuestionOutlineIcon
ml={'2px'}
onClick={() => {
router.push(AI_POINT_USAGE_CARD_ROUTE);
}}
/>
</MyTooltip>
<QuestionTip
ml={1}
label={t('support.wallet.subscription.AI points click to read tip')}
onClick={() => {
router.push(AI_POINT_USAGE_CARD_ROUTE);
}}
></QuestionTip>
</Flex>
</Flex>
<Flex alignItems={'center'}>