mirror of
https://github.com/labring/FastGPT.git
synced 2025-10-18 09:24:03 +00:00

* perf: system toolset & mcp (#5200) * feat: support system toolset * fix: type * fix: system tool config * chore: mcptool config migrate * refactor: mcp toolset * fix: fe type error * fix: type error * fix: show version * chore: support extract tool's secretInputConfig out of inputs * chore: compatible with old version mcp * chore: adjust * deps: update dependency @fastgpt-skd/plugin * fix: version * fix: some bug (#5316) * chore: compatible with old version mcp * fix: version * fix: compatible bug * fix: mcp object params * fix: type error * chore: update test cases * chore: remove log * fix: toolset node name * optimize app logs sort (#5310) * log keys config modal * multiple select * api * fontsize * code * chatid * fix build * fix * fix component * change name * log keys config * fix * delete unused * fix * perf: log code * perf: send auth code modal enter press * fix log (#5328) * perf: mcp toolset comment * perf: log ui * remove log (#5347) * doc * fix: action * remove log * fix: Table Optimization (#5319) * feat: table test: 1 * feat: table test: 2 * feat: table test: 3 * feat: table test: 4 * feat: table test : 5 把maxSize改回chunkSize * feat: table test : 6 都删了,只看maxSize * feat: table test : 7 恢复初始,接下来删除标签功能 * feat: table test : 8 删除标签功能 * feat: table test : 9 删除标签功能成功 * feat: table test : 10 继续调试,修改trainingStates * feat: table test : 11 修改第一步 * feat: table test : 12 修改第二步 * feat: table test : 13 修改了HtmlTable2Md * feat: table test : 14 修改表头分块规则 * feat: table test : 15 前面表格分的太细了 * feat: table test : 16 改着改着表头又不加了 * feat: table test : 17 用CUSTOM_SPLIT_SIGN不行,重新改 * feat: table test : 18 表头仍然还会多加,但现在分块搞的合理了终于 * feat: table test : 19 还是需要搞好表头问题,先保存一下调试情况 * feat: table test : 20 调试结束,看一下replace有没有问题,没问题就pr * feat: table test : 21 先把注释删了 * feat: table test : 21 注释replace都改了,下面切main分支看看情况 * feat: table test : 22 修改旧文件 * feat: table test : 23 修改测试文件 * feat: table test : 24 xlsx表格处理 * feat: table test : 25 刚才没保存先com了 * feat: table test : 26 fix * feat: table test : 27 先com一版调试 * feat: table test : 28 试试放format2csv里 * feat: table test : 29 xlsx解决 * feat: table test : 30 tablesplit解决 * feat: table test : 31 * feat: table test : 32 * perf: table split * perf: mcp old version compatibility (#5342) * fix: system-tool secret inputs * fix: rewrite runtime node i18n for system tool * perf: mcp old version compatibility * fix: splitPluginId * fix: old mcp toolId * fix: filter secret key * feat: support system toolset activation * chore: remove log * perf: mcp update * perf: rewrite toolset * fix:delete variable id (#5335) * perf: variable update * fix: multiple select ui * perf: model config move to plugin * fix: var conflit * perf: variable checker * Avoid empty number * update doc time * fix: test * fix: mcp object * update count app * update count app --------- Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com> Co-authored-by: heheer <heheer@sealos.io> Co-authored-by: heheer <zhiyu44@qq.com> Co-authored-by: colnii <1286949794@qq.com> Co-authored-by: dreamer6680 <1468683855@qq.com>
163 lines
4.4 KiB
TypeScript
163 lines
4.4 KiB
TypeScript
import React, { useState, useMemo, useRef, useEffect } from 'react';
|
|
import type { BoxProps } from '@chakra-ui/react';
|
|
import { Box, Card, Flex, useOutsideClick, Button } from '@chakra-ui/react';
|
|
import { addDays, format } from 'date-fns';
|
|
import { DayPicker } from 'react-day-picker';
|
|
import 'react-day-picker/dist/style.css';
|
|
import zhCN from 'date-fns/locale/zh-CN';
|
|
import { useTranslation } from 'next-i18next';
|
|
import MyIcon from '../Icon';
|
|
|
|
export type DateRangeType = {
|
|
from: Date;
|
|
to: Date;
|
|
};
|
|
|
|
const DateRangePicker = ({
|
|
onChange,
|
|
onSuccess,
|
|
popPosition = 'bottom',
|
|
defaultDate = {
|
|
from: addDays(new Date(), -30),
|
|
to: new Date()
|
|
},
|
|
dateRange,
|
|
formLabel,
|
|
...props
|
|
}: {
|
|
onChange?: (date: DateRangeType) => void;
|
|
onSuccess?: (date: DateRangeType) => void;
|
|
popPosition?: 'bottom' | 'top';
|
|
defaultDate?: DateRangeType;
|
|
dateRange?: DateRangeType;
|
|
formLabel?: string;
|
|
} & BoxProps) => {
|
|
const { t } = useTranslation();
|
|
const OutRangeRef = useRef(null);
|
|
const [range, setRange] = useState<DateRangeType>(defaultDate);
|
|
const [showSelected, setShowSelected] = useState(false);
|
|
|
|
useEffect(() => {
|
|
if (dateRange) {
|
|
setRange(dateRange);
|
|
}
|
|
}, [dateRange]);
|
|
|
|
const formatSelected = useMemo(() => {
|
|
if (range?.from && range.to) {
|
|
return `${format(range.from, 'y/MM/dd')} - ${format(range.to, 'y/MM/dd')}`;
|
|
}
|
|
return `${format(new Date(), 'y/MM/dd')} - ${format(new Date(), 'y/MM/dd')}`;
|
|
}, [range]);
|
|
|
|
useOutsideClick({
|
|
ref: OutRangeRef,
|
|
handler: () => {
|
|
setShowSelected(false);
|
|
}
|
|
});
|
|
|
|
return (
|
|
<Box position={'relative'} ref={OutRangeRef}>
|
|
<Flex
|
|
border={'base'}
|
|
px={3}
|
|
pr={3}
|
|
py={1}
|
|
borderRadius={'sm'}
|
|
cursor={'pointer'}
|
|
bg={'myGray.50'}
|
|
fontSize={'sm'}
|
|
onClick={() => setShowSelected(true)}
|
|
alignItems={'center'}
|
|
{...props}
|
|
>
|
|
{formLabel && (
|
|
<>
|
|
<Box fontSize={'sm'} color={'myGray.600'}>
|
|
{formLabel}
|
|
</Box>
|
|
<Box w={'1px'} h={'12px'} bg={'myGray.200'} mx={2} />
|
|
</>
|
|
)}
|
|
<Box color={'myGray.600'} fontWeight={'400'} flex={1}>
|
|
{formatSelected}
|
|
</Box>
|
|
{!formLabel && <MyIcon ml={2} name={'date'} w={'16px'} color={'myGray.600'} />}
|
|
</Flex>
|
|
{showSelected && (
|
|
<Card
|
|
position={'absolute'}
|
|
zIndex={1}
|
|
css={{
|
|
'--rdp-background-color': '#d6e8ff',
|
|
'--rdp-accent-color': '#0000ff'
|
|
}}
|
|
{...(popPosition === 'top'
|
|
? {
|
|
bottom: '40px'
|
|
}
|
|
: {})}
|
|
>
|
|
<DayPicker
|
|
locale={zhCN}
|
|
id="test"
|
|
mode="range"
|
|
defaultMonth={defaultDate.to}
|
|
selected={range}
|
|
disabled={[
|
|
{ from: new Date(2022, 3, 1), to: addDays(new Date(), -180) },
|
|
{ from: addDays(new Date(), 1), to: new Date(2099, 1, 1) }
|
|
]}
|
|
onSelect={(date) => {
|
|
let typeDate = date as DateRangeType;
|
|
if (!typeDate || typeDate?.from === undefined) {
|
|
typeDate = {
|
|
from: range?.from,
|
|
to: range?.from
|
|
};
|
|
}
|
|
if (typeDate?.to === undefined) {
|
|
typeDate.to = typeDate.from;
|
|
}
|
|
|
|
if (typeDate?.from) {
|
|
typeDate.from = new Date(typeDate.from.setHours(0, 0, 0, 0));
|
|
}
|
|
if (typeDate?.to) {
|
|
typeDate.to = new Date(typeDate.to.setHours(23, 59, 59, 999));
|
|
}
|
|
|
|
setRange(typeDate);
|
|
onChange?.(typeDate);
|
|
}}
|
|
footer={
|
|
<Flex justifyContent={'flex-end'}>
|
|
<Button
|
|
variant={'outline'}
|
|
size={'sm'}
|
|
mr={2}
|
|
onClick={() => setShowSelected(false)}
|
|
>
|
|
{t('common:Close')}
|
|
</Button>
|
|
<Button
|
|
size={'sm'}
|
|
onClick={() => {
|
|
onSuccess?.(range || defaultDate);
|
|
setShowSelected(false);
|
|
}}
|
|
>
|
|
{t('common:Confirm')}
|
|
</Button>
|
|
</Flex>
|
|
}
|
|
/>
|
|
</Card>
|
|
)}
|
|
</Box>
|
|
);
|
|
};
|
|
|
|
export default DateRangePicker;
|