diff --git a/web/src/components/spotlight.tsx b/web/src/components/spotlight.tsx index f5eacbcee..50b4682f5 100644 --- a/web/src/components/spotlight.tsx +++ b/web/src/components/spotlight.tsx @@ -1,10 +1,14 @@ import { useIsDarkTheme } from '@/components/theme-provider'; +import { parseColorToRGB } from '@/utils/common-util'; import React from 'react'; interface SpotlightProps { className?: string; opcity?: number; coverage?: number; + X?: string; + Y?: string; + color?: string; } /** * @@ -16,9 +20,20 @@ const Spotlight: React.FC = ({ className, opcity = 0.5, coverage = 60, + X = '50%', + Y = '190%', + color, }) => { const isDark = useIsDarkTheme(); - const rgb = isDark ? '255, 255, 255' : '194, 221, 243'; + let realColor: [number, number, number] | undefined = undefined; + if (color) { + realColor = parseColorToRGB(color); + } + const rgb = realColor + ? realColor.join(',') + : isDark + ? '255, 255, 255' + : '194, 221, 243'; return (
= ({
diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 40c04928b..fd5c0f016 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -57,6 +57,8 @@ export default { }, }, login: { + loginTitle: 'Sign in to Your Account', + signUpTitle: 'Create an Account', login: 'Sign in', signUp: 'Sign up', loginDescription: 'We’re so excited to see you again!', @@ -72,7 +74,8 @@ export default { nicknamePlaceholder: 'Please input nickname', register: 'Create an account', continue: 'Continue', - title: 'Start building your smart assistants.', + title: 'A leading RAG engine for LLM context', + start: "Let's get started", description: 'Sign up for free to explore top RAG technology. Create knowledge bases and AIs to empower your business.', review: 'from 500+ reviews', @@ -114,7 +117,7 @@ export default { generateRaptor: 'This will extract entities and relationships from all your documents in this dataset. The process may take a while to complete.', generate: 'Generate', - raptor: 'Raptor', + raptor: 'RAPTOR', processingType: 'Processing Type', dataPipeline: 'Ingestion pipeline', operations: 'Operations', @@ -128,7 +131,7 @@ export default { fileName: 'File Name', datasetLogs: 'Dataset', fileLogs: 'File', - overview: 'Overview', + overview: 'Logs', success: 'Success', failed: 'Failed', completed: 'Completed', @@ -270,7 +273,7 @@ export default { reRankModelWaring: 'Re-rank model is very time consuming.', }, knowledgeConfiguration: { - tocExtraction: 'toc toggle', + tocExtraction: 'TOC Enhance', tocExtractionTip: " For existing chunks, generate a hierarchical table of contents (one directory per file). During queries, when Directory Enhancement is activated, the system will use a large model to determine which directory items are relevant to the user's question, thereby identifying the relevant chunks.", deleteGenerateModalContent: ` @@ -1817,9 +1820,13 @@ Important structured information may include: names, dates, locations, events, k }, datasetOverview: { downloadTip: 'Files being downloaded from data sources. ', - processingTip: 'Files being processed by data flows.', + processingTip: 'Files being processed by data pipelines.', totalFiles: 'Total Files', downloading: 'Downloading', + downloadSuccessTip: 'Total successful downloads', + downloadFailedTip: 'Total failed downloads', + processingSuccessTip: 'Total successfully processed files', + processingFailedTip: 'Total failed processes', processing: 'Processing', }, }, diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index f58209995..119aad5d6 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -49,6 +49,8 @@ export default { promptPlaceholder: '请输入或使用 / 快速插入变量。', }, login: { + loginTitle: '登录账户', + signUpTitle: '创建账户', login: '登录', signUp: '注册', loginDescription: '很高兴再次见到您!', @@ -64,7 +66,8 @@ export default { nicknamePlaceholder: '请输入名称', register: '创建账户', continue: '继续', - title: '开始构建您的智能助手', + title: 'A leading RAG engine for LLM context', + start: '立即开始', description: '免费注册以探索顶级 RAG 技术。 创建知识库和人工智能来增强您的业务', review: '来自 500 多条评论', @@ -116,7 +119,7 @@ export default { fileName: '文件名', datasetLogs: '数据集', fileLogs: '文件', - overview: '概览', + overview: '日志', success: '成功', failed: '失败', completed: '已完成', @@ -255,7 +258,7 @@ export default { theDocumentBeingParsedCannotBeDeleted: '正在解析的文档不能被删除', }, knowledgeConfiguration: { - tocExtraction: '目录提取', + tocExtraction: '目录增强', tocExtractionTip: '对于已有的chunk生成层级结构的目录信息(每个文件一个目录)。在查询时,激活`目录增强`后,系统会用大模型去判断用户问题和哪些目录项相关,从而找到相关的chunk。', deleteGenerateModalContent: ` @@ -1713,6 +1716,10 @@ Tokenizer 会根据所选方式将内容存储为对应的数据结构。`, totalFiles: '文件总数', downloading: '正在下载', processing: '正在处理', + downloadSuccessTip: '下载成功总数', + downloadFailedTip: '下载失败总数', + processingSuccessTip: '处理成功的文件总数', + processingFailedTip: '处理失败的文件总数', }, }, }; diff --git a/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/components/document-preview/index.less b/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/components/document-preview/index.less index bbba51f09..8f456af5a 100644 --- a/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/components/document-preview/index.less +++ b/web/src/pages/chunk/parsed-result/add-knowledge/components/knowledge-chunk/components/document-preview/index.less @@ -1,7 +1,7 @@ .documentContainer { width: 100%; // height: calc(100vh - 284px); - height: calc(100vh - 170px); + height: calc(100vh - 180px); position: relative; :global(.PdfHighlighter) { overflow-x: hidden; diff --git a/web/src/pages/dataflow-result/components/document-preview/index.less b/web/src/pages/dataflow-result/components/document-preview/index.less index bbba51f09..8f456af5a 100644 --- a/web/src/pages/dataflow-result/components/document-preview/index.less +++ b/web/src/pages/dataflow-result/components/document-preview/index.less @@ -1,7 +1,7 @@ .documentContainer { width: 100%; // height: calc(100vh - 284px); - height: calc(100vh - 170px); + height: calc(100vh - 180px); position: relative; :global(.PdfHighlighter) { overflow-x: hidden; diff --git a/web/src/pages/dataflow-result/components/document-preview/index.tsx b/web/src/pages/dataflow-result/components/document-preview/index.tsx index dd7b35348..0a5cf08e8 100644 --- a/web/src/pages/dataflow-result/components/document-preview/index.tsx +++ b/web/src/pages/dataflow-result/components/document-preview/index.tsx @@ -4,7 +4,6 @@ import CSVFileViewer from './csv-preview'; import { DocPreviewer } from './doc-preview'; import { ExcelCsvPreviewer } from './excel-preview'; import { ImagePreviewer } from './image-preview'; -import styles from './index.less'; import PdfPreviewer, { IProps } from './pdf-preview'; import { PptPreviewer } from './ppt-preview'; import { TxtPreviewer } from './txt-preview'; @@ -24,7 +23,7 @@ const Preview = ({ return ( <> {fileType === 'pdf' && highlights && setWidthAndHeight && ( -
+
= ({ @@ -56,7 +58,9 @@ const StatCard: FC = ({ const CardFooterProcess: FC = ({ success = 0, + successTip, failed = 0, + failedTip, }) => { const { t } = useTranslation(); return ( @@ -65,8 +69,13 @@ const CardFooterProcess: FC = ({
-
+
{t('knowledgeDetails.success')} + {successTip && ( + + + + )}
{success || 0}
@@ -74,8 +83,13 @@ const CardFooterProcess: FC = ({
-
+
{t('knowledgeDetails.failed')} + {failedTip && ( + + + + )}
{failed || 0}
@@ -259,7 +273,9 @@ const FileLogsPage: FC = () => { > { >
diff --git a/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx b/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx index 031bce547..e84900f64 100644 --- a/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx +++ b/web/src/pages/dataset/dataset-setting/configuration/common-item.tsx @@ -144,7 +144,12 @@ export function ParseTypeItem({ line = 2 }: { line?: number }) { > -
+
{t('builtIn')} {t('manualSetup')}
diff --git a/web/src/pages/dataset/dataset/generate-button/hook.ts b/web/src/pages/dataset/dataset/generate-button/hook.ts index 772c36ed7..e45a81e38 100644 --- a/web/src/pages/dataset/dataset/generate-button/hook.ts +++ b/web/src/pages/dataset/dataset/generate-button/hook.ts @@ -6,7 +6,7 @@ import { t } from 'i18next'; import { useEffect, useState } from 'react'; import { useParams } from 'umi'; import { ProcessingType } from '../../dataset-overview/dataset-common'; -import { GenerateType } from './generate'; +import { GenerateType, GenerateTypeMap } from './generate'; export const generateStatus = { running: 'running', completed: 'completed', @@ -103,9 +103,28 @@ export const useTraceGenerate = ({ open }: { open: boolean }) => { raptorRunloading, }; }; + +export const useUnBindTask = () => { + const { id } = useParams(); + const { mutateAsync: handleUnbindTask } = useMutation({ + mutationKey: [DatasetKey.pauseGenerate], + mutationFn: async ({ type }: { type: ProcessingType }) => { + const { data } = await deletePipelineTask({ kb_id: id as string, type }); + if (data.code === 0) { + message.success(t('message.operated')); + // queryClient.invalidateQueries({ + // queryKey: [type], + // }); + } + return data; + }, + }); + return { handleUnbindTask }; +}; export const useDatasetGenerate = () => { const queryClient = useQueryClient(); const { id } = useParams(); + const { handleUnbindTask } = useUnBindTask(); const { data, isPending: loading, @@ -143,8 +162,12 @@ export const useDatasetGenerate = () => { type: GenerateType; }) => { const { data } = await agentService.cancelDataflow(task_id); - if (data.code === 0) { - message.success(t('message.operated')); + + const unbindData = await handleUnbindTask({ + type: GenerateTypeMap[type as GenerateType], + }); + if (data.code === 0 && unbindData.code === 0) { + // message.success(t('message.operated')); queryClient.invalidateQueries({ queryKey: [type], }); @@ -154,21 +177,3 @@ export const useDatasetGenerate = () => { }); return { runGenerate: mutateAsync, pauseGenerate, data, loading }; }; - -export const useUnBindTask = () => { - const { id } = useParams(); - const { mutateAsync: handleUnbindTask } = useMutation({ - mutationKey: [DatasetKey.pauseGenerate], - mutationFn: async ({ type }: { type: ProcessingType }) => { - const { data } = await deletePipelineTask({ kb_id: id as string, type }); - if (data.code === 0) { - message.success(t('message.operated')); - // queryClient.invalidateQueries({ - // queryKey: [type], - // }); - } - return data; - }, - }); - return { handleUnbindTask }; -}; diff --git a/web/src/pages/dataset/sidebar/index.tsx b/web/src/pages/dataset/sidebar/index.tsx index 722f59967..d48019e51 100644 --- a/web/src/pages/dataset/sidebar/index.tsx +++ b/web/src/pages/dataset/sidebar/index.tsx @@ -10,7 +10,7 @@ import { cn, formatBytes } from '@/lib/utils'; import { Routes } from '@/routes'; import { formatPureDate } from '@/utils/date'; import { isEmpty } from 'lodash'; -import { Banknote, DatabaseZap, FileSearch2, FolderOpen } from 'lucide-react'; +import { Banknote, FileSearch2, FolderOpen, Logs } from 'lucide-react'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useHandleMenuClick } from './hooks'; @@ -40,7 +40,7 @@ export function SideBar({ refreshCount }: PropType) { key: Routes.DatasetTesting, }, { - icon: , + icon: , label: t(`knowledgeDetails.overview`), key: Routes.DataSetOverview, }, diff --git a/web/src/pages/datasets/dataset-creating-dialog.tsx b/web/src/pages/datasets/dataset-creating-dialog.tsx index 6b54de904..d372352c1 100644 --- a/web/src/pages/datasets/dataset-creating-dialog.tsx +++ b/web/src/pages/datasets/dataset-creating-dialog.tsx @@ -17,7 +17,6 @@ import { } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { FormLayout } from '@/constants/form'; -import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; import { IModalProps } from '@/interfaces/common'; import { zodResolver } from '@hookform/resolvers/zod'; import { useEffect } from 'react'; @@ -103,7 +102,6 @@ export function InputForm({ onOk }: IModalProps) { form.setValue('pipeline_id', ''); } }, [parseType, form]); - const { navigateToAgents } = useNavigatePage(); return (
@@ -157,7 +155,7 @@ export function DatasetCreatingDialog({ return ( - + {t('knowledgeList.createKnowledgeBase')} diff --git a/web/src/pages/login-next/card.tsx b/web/src/pages/login-next/card.tsx new file mode 100644 index 000000000..0908da6a1 --- /dev/null +++ b/web/src/pages/login-next/card.tsx @@ -0,0 +1,39 @@ +import React, { useEffect, useState } from 'react'; +import './index.less'; + +type IProps = { + children: React.ReactNode; + isLoginPage: boolean; +}; +const FlipCard3D = (props: IProps) => { + const { children, isLoginPage } = props; + const [isFlipped, setIsFlipped] = useState(false); + useEffect(() => { + console.log('title', isLoginPage); + if (isLoginPage) { + setIsFlipped(false); + } else { + setIsFlipped(true); + } + }, [isLoginPage]); + + return ( +
+
+ {/* Front Face */} +
+ {children} +
+ + {/* Back Face */} +
+ {children} +
+
+
+ ); +}; + +export default FlipCard3D; diff --git a/web/src/pages/login-next/index.less b/web/src/pages/login-next/index.less index 2322be352..1ce641c32 100644 --- a/web/src/pages/login-next/index.less +++ b/web/src/pages/login-next/index.less @@ -40,3 +40,17 @@ } ////////////////////////////////////////////////////////////////////////// +.perspective-1000 { + perspective: 1000px; +} +.transform-style-3d { + transform-style: preserve-3d; + transition-duration: 0.4s; +} +.backface-hidden { + backface-visibility: hidden; +} + +.rotate-y-180 { + transform: rotateY(180deg); +} diff --git a/web/src/pages/login-next/index.tsx b/web/src/pages/login-next/index.tsx index 35e3e76b4..8b8601889 100644 --- a/web/src/pages/login-next/index.tsx +++ b/web/src/pages/login-next/index.tsx @@ -25,11 +25,12 @@ import { } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { zodResolver } from '@hookform/resolvers/zod'; +import { Eye, EyeOff } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { BgSvg } from './bg'; +import FlipCard3D from './card'; import './index.less'; -import { SpotlightTopLeft, SpotlightTopRight } from './spotlight-top'; const Login = () => { const [title, setTitle] = useState('login'); @@ -40,6 +41,8 @@ const Login = () => { const { login: loginWithChannel, loading: loginWithChannelLoading } = useLoginWithChannel(); const { t } = useTranslation('translation', { keyPrefix: 'login' }); + const [isLoginPage, setIsLoginPage] = useState(true); + const [showPassword, setShowPassword] = useState(false); const loading = signLoading || registerLoading || @@ -60,10 +63,15 @@ const Login = () => { }; const changeTitle = () => { + setIsLoginPage(title !== 'login'); if (title === 'login' && !registerEnabled) { return; } - setTitle((title) => (title === 'login' ? 'register' : 'login')); + + setTimeout(() => { + setTitle(title === 'login' ? 'register' : 'login'); + }, 200); + // setTitle((title) => (title === 'login' ? 'register' : 'login')); }; const FormSchema = z @@ -129,177 +137,214 @@ const Login = () => { return (
- - - + + + + + {/* */}
-
+
logo
- RAGFlow +
RAGFlow
-

- A Leading RAG engine with Agent for superior LLM context. -

+

{t('title')}

- Let's get started + {t('start')}
{/* Logo and Header */} {/* Login Form */} -
-

- {title === 'login' - ? 'Sign in to Your Account' - : 'Create an Account'} -

-
-
- - onCheck(data))} - > - ( - - {t('emailLabel')} - - - - - - )} - /> - {title === 'register' && ( - ( - - {t('nicknameLabel')} - - - - - - )} - /> - )} - - ( - - {t('passwordLabel')} - - - - - - )} - /> - - {title === 'login' && ( - ( - - -
- { - field.onChange(checked); - }} + +
+
+

+ {title === 'login' ? t('loginTitle') : t('signUpTitle')} +

+
+
+ + onCheck(data))} + > + ( + + {t('emailLabel')} + + - {t('rememberMe')} -
- - - + + + + )} + /> + {title === 'register' && ( + ( + + {t('nicknameLabel')} + + + + + + )} + /> )} - /> - )} - - {title === 'login' ? t('login') : t('continue')} - - {title === 'login' && channels && channels.length > 0 && ( -
- {channels.map((item) => ( + + ( + + {t('passwordLabel')} + +
+ + +
+
+ +
+ )} + /> + + {title === 'login' && ( + ( + + +
+ { + field.onChange(checked); + }} + /> + {t('rememberMe')} +
+
+ +
+ )} + /> + )} + + {title === 'login' ? t('login') : t('continue')} + + {title === 'login' && channels && channels.length > 0 && ( +
+ {channels.map((item) => ( + + ))} +
+ )} + + + + {title === 'login' && registerEnabled && ( +
+

+ {t('signInTip')} - ))} +

+
+ )} + {title === 'register' && ( +
+

+ {t('signUpTip')} + +

)} - - - - {title === 'login' && registerEnabled && ( -
-

- {t('signInTip')} - -

- )} - {title === 'register' && ( -
-

- {t('signUpTip')} - -

-
- )} -
+
+
); diff --git a/web/src/pages/login-next/spotlight-top.tsx b/web/src/pages/login-next/spotlight-top.tsx deleted file mode 100644 index 0615f09b5..000000000 --- a/web/src/pages/login-next/spotlight-top.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { useIsDarkTheme } from '@/components/theme-provider'; -import React from 'react'; - -interface SpotlightProps { - className?: string; - opcity?: number; - coverage?: number; -} -/** - * - * @param opcity 0~1 default 0.5 - * @param coverage 0~100 default 60 - * @returns - */ -export const SpotlightTopLeft: React.FC = ({ - className, - opcity = 0.5, - coverage = 60, -}) => { - const isDark = useIsDarkTheme(); - const rgb = isDark ? '255, 255, 255' : '194, 221, 243'; - return ( -
-
-
- ); -}; -/** - * - * @param opcity 0~1 default 0.5 - * @param coverage 0~100 default 60 - * @returns - */ -export const SpotlightTopRight: React.FC = ({ - className, - opcity = 0.5, - coverage = 60, -}) => { - const isDark = useIsDarkTheme(); - const rgb = isDark ? '255, 255, 255' : '194, 221, 243'; - return ( -
-
-
- ); -}; diff --git a/web/src/routes.ts b/web/src/routes.ts index a1ee7dc75..e35609559 100644 --- a/web/src/routes.ts +++ b/web/src/routes.ts @@ -1,6 +1,6 @@ export enum Routes { Root = '/', - Login = '/login', + Login = '/login-next', Logout = '/logout', Home = '/home', Datasets = '/datasets', @@ -52,7 +52,7 @@ export enum Routes { const routes = [ { path: '/login', - component: '@/pages/login', + component: '@/pages/login-next', layout: false, }, { diff --git a/web/src/utils/common-util.ts b/web/src/utils/common-util.ts index 879848a8f..b88e870fa 100644 --- a/web/src/utils/common-util.ts +++ b/web/src/utils/common-util.ts @@ -220,7 +220,7 @@ export function parseColorToRGB(color: string): [number, number, number] { // Handling RGB colors (e.g., rgb(255, 87, 51)) if (colorStr.startsWith('rgb')) { - const rgbMatch = colorStr.match(/rgb$$(\d+),\s*(\d+),\s*(\d+)$$/); + const rgbMatch = colorStr.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/); if (rgbMatch) { return [ parseInt(rgbMatch[1]),