{t('scopeDataset')}
{t('scopeSingleFile')}
diff --git a/web/src/components/ragflow-avatar.tsx b/web/src/components/ragflow-avatar.tsx
index e84a01b34..e3bfc5700 100644
--- a/web/src/components/ragflow-avatar.tsx
+++ b/web/src/components/ragflow-avatar.tsx
@@ -11,6 +11,8 @@ const PREDEFINED_COLORS = [
];
const getStringHash = (str: string): number => {
+ if (typeof str !== 'string') return 0;
+
const normalized = str.trim().toLowerCase();
let hash = 104729;
const seed = 0x9747b28c;
@@ -41,8 +43,8 @@ export const RAGFlowAvatar = memo(
>(({ name, avatar, isPerson = false, className, ...props }, ref) => {
// Generate initial letter logic
const getInitials = (name?: string) => {
- if (!name) return '';
- const parts = name.trim().split(/\s+/);
+ if (typeof name !== 'string' || !name) return '';
+ const parts = name?.trim().split(/\s+/);
if (parts.length === 1) {
return parts[0][0].toUpperCase();
}
diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts
index 4a36f3a6f..e176b7e3d 100644
--- a/web/src/locales/en.ts
+++ b/web/src/locales/en.ts
@@ -694,6 +694,7 @@ This auto-tagging feature enhances retrieval by adding another layer of domain-s
tocEnhanceTip: ` During the parsing of the document, table of contents information was generated (see the 'Enable Table of Contents Extraction' option in the General method). This allows the large model to return table of contents items relevant to the user's query, thereby using these items to retrieve related chunks and apply weighting to these chunks during the sorting process. This approach is derived from mimicking the behavioral logic of how humans search for knowledge in books.`,
},
setting: {
+ selectModelPlaceholder: 'Select model',
configureModelTitle: 'Configure model',
confluenceIsCloudTip:
'Check if this is a Confluence Cloud instance, uncheck for Confluence Server/Data Center',
@@ -729,7 +730,7 @@ Example: general/v2/`,
google_driveSharedFoldersTip:
'Comma-separated Google Drive folder links to crawl.',
availableSourcesDescription: 'Select a data source to add',
- availableSources: 'Available Sources',
+ availableSources: 'Available sources',
datasourceDescription: 'Manage your data source and connections',
save: 'Save',
search: 'Search',
@@ -748,7 +749,7 @@ Example: general/v2/`,
'Please enter your current password to change your password.',
model: 'Model providers',
systemModelDescription: 'Please complete these settings before beginning',
- dataSources: 'Data Sources',
+ dataSources: 'Data sources',
team: 'Team',
system: 'System',
logout: 'Log out',
@@ -787,8 +788,8 @@ Example: general/v2/`,
'Please enter the API key (for locally deployed model,ignore this).',
apiKeyTip:
'The API key can be obtained by registering the corresponding LLM supplier.',
- showMoreModels: 'View Models',
- hideModels: 'Hide Models',
+ showMoreModels: 'View models',
+ hideModels: 'Hide models',
baseUrl: 'Base-Url',
baseUrlTip:
'If your API key is from OpenAI, just ignore it. Any other intermediate providers will give this base url with the API key.',
@@ -813,7 +814,7 @@ Example: general/v2/`,
ttsModel: 'TTS',
ttsModelTip:
'The default text-to-speech model. If you cannot find a model from the dropdown, check https://ragflow.io/docs/dev/supported_models to see if your model provider supports this model.',
- workspace: 'Workspace',
+ workspace: 'workspace',
upgrade: 'Upgrade',
addLlmTitle: 'Add LLM',
editLlmTitle: 'Edit {{name}} Model',
@@ -921,11 +922,11 @@ Example: general/v2/`,
add: 'Add',
updateDate: 'Date',
role: 'State',
- invite: 'Invite Member',
+ invite: 'Invite member',
agree: 'Accept',
refuse: 'Decline',
- teamMembers: 'Team Members',
- joinedTeams: 'Joined Teams',
+ teamMembers: 'Team members',
+ joinedTeams: 'Joined teams',
sureDelete: 'Are you sure to remove this member?',
quit: 'Quit',
sureQuit: 'Are you sure you want to quit the team you joined?',
@@ -1825,7 +1826,7 @@ Important structured information may include: names, dates, locations, events, k
addMCP: 'Add MCP',
editMCP: 'Edit MCP',
toolsAvailable: 'tools available',
- mcpServers: 'MCP Servers',
+ mcpServers: 'MCP servers',
customizeTheListOfMcpServers: 'Customize the list of MCP servers',
cachedTools: 'cached tools',
bulkManage: 'Bulk manage',
diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts
index 9c90d734b..4e6f7e0d9 100644
--- a/web/src/locales/zh.ts
+++ b/web/src/locales/zh.ts
@@ -684,6 +684,7 @@ General:实体和关系提取提示来自 GitHub - microsoft/graphrag:基于
tocEnhanceTip: `解析文档时生成了目录信息(见General方法的‘启用目录抽取’),让大模型返回和用户问题相关的目录项,从而利用目录项拿到相关chunk,对这些chunk在排序中进行加权。这种方法来源于模仿人类查询书本中知识的行为逻辑`,
},
setting: {
+ selectModelPlaceholder: '请选择模型',
configureModelTitle: '配置模型',
confluenceIsCloudTip:
'检查这是否是 Confluence Cloud 实例,如果是 Confluence 服务/数据中心,则取消选中。',
diff --git a/web/src/pages/admin/login.tsx b/web/src/pages/admin/login.tsx
index 589db8a88..33f696052 100644
--- a/web/src/pages/admin/login.tsx
+++ b/web/src/pages/admin/login.tsx
@@ -126,7 +126,7 @@ function AdminLogin() {
color="rgb(128, 255, 248)"
/>
-
+
diff --git a/web/src/pages/login-next/bg.tsx b/web/src/pages/login-next/bg.tsx
index a4ec08853..2ac801e4a 100644
--- a/web/src/pages/login-next/bg.tsx
+++ b/web/src/pages/login-next/bg.tsx
@@ -5,7 +5,9 @@ const aspectRatio = {
bottom: 704,
};
-export const BgSvg = () => {
+export const BgSvg = ({ isPaused = false }: { isPaused?: boolean }) => {
+ const animationClass = isPaused ? 'paused' : '';
+
const def = (
path: string,
id: number | string = '',
@@ -124,7 +126,7 @@ export const BgSvg = () => {
{def(
@@ -134,7 +136,7 @@ export const BgSvg = () => {
)}
{def(
@@ -144,7 +146,7 @@ export const BgSvg = () => {
)}
{def(
diff --git a/web/src/pages/login-next/index.less b/web/src/pages/login-next/index.less
index 7c52f360a..e25358d29 100644
--- a/web/src/pages/login-next/index.less
+++ b/web/src/pages/login-next/index.less
@@ -1,6 +1,3 @@
-.animate-glow {
- animation: glow 16s infinite linear;
-}
.mask-path {
stroke-width: 8;
::after {
@@ -34,11 +31,20 @@
stroke-dashoffset: -600;
} /* 15+300-30=285 */
}
-
+.animate-glow {
+ animation: glow 16s infinite linear;
+}
.animate-highlight {
animation: highlight-flow 16s linear infinite;
}
+.paused {
+ .animate-glow,
+ .animate-highlight {
+ animation-play-state: paused;
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
.perspective-1000 {
perspective: 1000px;
@@ -47,11 +53,13 @@
min-height: 680px;
display: flex;
align-items: center;
+ will-change: transform;
}
.transform-style-3d {
transform-style: preserve-3d;
-webkit-transform-style: preserve-3d;
transition-duration: 0.4s;
+ will-change: transform;
}
.backface-hidden {
backface-visibility: hidden;
diff --git a/web/src/pages/login-next/index.tsx b/web/src/pages/login-next/index.tsx
index c9354225f..1db5e7fbf 100644
--- a/web/src/pages/login-next/index.tsx
+++ b/web/src/pages/login-next/index.tsx
@@ -42,7 +42,9 @@ const Login = () => {
useLoginWithChannel();
const { t } = useTranslation('translation', { keyPrefix: 'login' });
const [isLoginPage, setIsLoginPage] = useState(true);
- const [showPassword, setShowPassword] = useState(false);
+
+ const [isUserInteracting, setIsUserInteracting] = useState(true);
+
const loading =
signLoading ||
registerLoading ||
@@ -152,9 +154,8 @@ const Login = () => {
color={'rgb(128, 255, 248)'}
/>
-
+
- {/*
*/}
@@ -237,7 +238,7 @@ const Login = () => {
(
+ render: (fieldProps: any) => (
{
value={value}
options={options}
onChange={(value) => handleFieldChange(id, value)}
- placeholder={tcommon('selectPlaceholder')}
+ placeholder={t('selectModelPlaceholder')}
/>
);
diff --git a/web/src/pages/user-setting/setting-model/components/un-add-model.tsx b/web/src/pages/user-setting/setting-model/components/un-add-model.tsx
index 3d8b1d5e2..88897ce83 100644
--- a/web/src/pages/user-setting/setting-model/components/un-add-model.tsx
+++ b/web/src/pages/user-setting/setting-model/components/un-add-model.tsx
@@ -123,16 +123,14 @@ export const AvailableModels: FC<{
handleAddModel(model.name)}
>
{model.name}
-