From 9fdaa14c8de9adef47de3df8b27c02bc99218778 Mon Sep 17 00:00:00 2001 From: twwu Date: Wed, 10 Sep 2025 10:51:48 +0800 Subject: [PATCH 1/6] fix: Handle missing dataset avatars and improve routing --- .../datasets/common/credential-icon.tsx | 10 ++- .../components/header/dataset-nav/index.tsx | 66 +++++++++++++------ web/app/components/header/nav/index.tsx | 1 - web/models/datasets.ts | 2 +- 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/web/app/components/datasets/common/credential-icon.tsx b/web/app/components/datasets/common/credential-icon.tsx index d701ed25fa..bc891529ab 100644 --- a/web/app/components/datasets/common/credential-icon.tsx +++ b/web/app/components/datasets/common/credential-icon.tsx @@ -1,5 +1,5 @@ import cn from '@/utils/classnames' -import React, { useMemo } from 'react' +import React, { useCallback, useMemo, useState } from 'react' type CredentialIconProps = { avatar_url?: string @@ -21,10 +21,15 @@ export const CredentialIcon: React.FC = ({ size = 20, className = '', }) => { + const [showAvatar, setShowAvatar] = useState(!!avatar_url) const firstLetter = useMemo(() => name.charAt(0).toUpperCase(), [name]) const bgColor = useMemo(() => ICON_BG_COLORS[firstLetter.charCodeAt(0) % ICON_BG_COLORS.length], [firstLetter]) - if (avatar_url && avatar_url !== 'default') { + const onImgLoadError = useCallback(() => { + setShowAvatar(false) + }, []) + + if (avatar_url && avatar_url !== 'default' && showAvatar) { return (
= ({ width={size} height={size} className={cn('shrink-0 object-contain', className)} + onError={onImgLoadError} />
) diff --git a/web/app/components/header/dataset-nav/index.tsx b/web/app/components/header/dataset-nav/index.tsx index 6165128e82..60fd1b3f68 100644 --- a/web/app/components/header/dataset-nav/index.tsx +++ b/web/app/components/header/dataset-nav/index.tsx @@ -1,6 +1,6 @@ 'use client' -import { useCallback } from 'react' +import { useCallback, useMemo } from 'react' import { useTranslation } from 'react-i18next' import { useParams, useRouter } from 'next/navigation' import { @@ -28,6 +28,49 @@ const DatasetNav = () => { }) const datasetItems = flatten(datasetList?.pages.map(datasetData => datasetData.data)) + const curNav = useMemo(() => { + if (!currentDataset) return + return { + id: currentDataset.id, + name: currentDataset.name, + icon: currentDataset.icon_info.icon, + icon_type: currentDataset.icon_info.icon_type, + icon_background: currentDataset.icon_info.icon_background, + icon_url: currentDataset.icon_info.icon_url, + } as Omit + }, [currentDataset?.id, currentDataset?.name, currentDataset?.icon_info]) + + const navigationItems = useMemo(() => { + return datasetItems.map((dataset) => { + const isPipelineUnpublished = dataset.runtime_mode === 'rag_pipeline' && !dataset.is_published + const internalLink = isPipelineUnpublished + ? `/datasets/${dataset.id}/pipeline` + : `/datasets/${dataset.id}/documents` + const link = dataset.provider === 'external' + ? `/datasets/${dataset.id}/hitTesting` + : internalLink + return { + id: dataset.id, + name: dataset.name, + link, + icon: dataset.icon_info.icon, + icon_type: dataset.icon_info.icon_type, + icon_background: dataset.icon_info.icon_background, + icon_url: dataset.icon_info.icon_url, + } + }) as NavItem[] + }, [datasetItems]) + + const createRouter = useMemo(() => { + const runtimeMode = currentDataset?.runtime_mode + if (runtimeMode === 'rag_pipeline') + return `${basePath}/datasets/create-from-pipeline` + else if (runtimeMode === 'general') + return `${basePath}/datasets/create` + else + return `${basePath}/datasets/create` + }, [currentDataset?.runtime_mode]) + const handleLoadMore = useCallback(() => { if (hasNextPage) fetchNextPage() @@ -41,25 +84,10 @@ const DatasetNav = () => { text={t('common.menus.datasets')} activeSegment='datasets' link='/datasets' - curNav={currentDataset && { - id: currentDataset.id, - name: currentDataset.name, - icon: currentDataset.icon_info.icon, - icon_type: currentDataset.icon_info.icon_type, - icon_background: currentDataset.icon_info.icon_background, - icon_url: currentDataset.icon_info.icon_url, - } as Omit} - navigationItems={datasetItems.map(dataset => ({ - id: dataset.id, - name: dataset.name, - link: dataset.provider === 'external' ? `/datasets/${dataset.id}/hitTesting` : `/datasets/${dataset.id}/documents`, - icon: dataset.icon_info.icon, - icon_type: dataset.icon_info.icon_type, - icon_background: dataset.icon_info.icon_background, - icon_url: dataset.icon_info.icon_url, - })) as NavItem[]} + curNav={curNav} + navigationItems={navigationItems} createText={t('common.menus.newDataset')} - onCreate={() => router.push(`${basePath}/datasets/create`)} + onCreate={() => router.push(createRouter)} onLoadMore={handleLoadMore} /> ) diff --git a/web/app/components/header/nav/index.tsx b/web/app/components/header/nav/index.tsx index 8c09a724de..3dfb77ca6a 100644 --- a/web/app/components/header/nav/index.tsx +++ b/web/app/components/header/nav/index.tsx @@ -42,7 +42,6 @@ const Nav = ({ useEffect(() => { if (pathname === link) setLinkLastSearchParams(searchParams.toString()) - // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname, searchParams]) return ( diff --git a/web/models/datasets.ts b/web/models/datasets.ts index 92506aa733..c71a46e0a5 100644 --- a/web/models/datasets.ts +++ b/web/models/datasets.ts @@ -403,7 +403,7 @@ export type SimpleDocumentDetail = InitialDocumentDetail & { } } doc_metadata?: MetadataItemWithValue[] - created_from: string + created_from: 'rag-pipeline' | 'web' } export type DocumentListResponse = { From 9ae6978a779ab959e8dbdbe625eb27da9bd913da Mon Sep 17 00:00:00 2001 From: twwu Date: Wed, 10 Sep 2025 11:00:49 +0800 Subject: [PATCH 2/6] refactor: Simplify dataset navigation and avatar display logic --- web/app/components/datasets/common/credential-icon.tsx | 2 +- web/app/components/header/dataset-nav/index.tsx | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/web/app/components/datasets/common/credential-icon.tsx b/web/app/components/datasets/common/credential-icon.tsx index bc891529ab..cbcd045738 100644 --- a/web/app/components/datasets/common/credential-icon.tsx +++ b/web/app/components/datasets/common/credential-icon.tsx @@ -21,7 +21,7 @@ export const CredentialIcon: React.FC = ({ size = 20, className = '', }) => { - const [showAvatar, setShowAvatar] = useState(!!avatar_url) + const [showAvatar, setShowAvatar] = useState(true) const firstLetter = useMemo(() => name.charAt(0).toUpperCase(), [name]) const bgColor = useMemo(() => ICON_BG_COLORS[firstLetter.charCodeAt(0) % ICON_BG_COLORS.length], [firstLetter]) diff --git a/web/app/components/header/dataset-nav/index.tsx b/web/app/components/header/dataset-nav/index.tsx index 60fd1b3f68..96879ec08d 100644 --- a/web/app/components/header/dataset-nav/index.tsx +++ b/web/app/components/header/dataset-nav/index.tsx @@ -65,8 +65,6 @@ const DatasetNav = () => { const runtimeMode = currentDataset?.runtime_mode if (runtimeMode === 'rag_pipeline') return `${basePath}/datasets/create-from-pipeline` - else if (runtimeMode === 'general') - return `${basePath}/datasets/create` else return `${basePath}/datasets/create` }, [currentDataset?.runtime_mode]) From 88563f10dfa222fc81ac71bd4054e656a0a57204 Mon Sep 17 00:00:00 2001 From: twwu Date: Wed, 10 Sep 2025 11:04:02 +0800 Subject: [PATCH 3/6] Update datasets.ts --- web/models/datasets.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/models/datasets.ts b/web/models/datasets.ts index c71a46e0a5..5167c75670 100644 --- a/web/models/datasets.ts +++ b/web/models/datasets.ts @@ -377,7 +377,7 @@ export type InitialDocumentDetail = { data_source_info: DataSourceInfo dataset_process_rule_id: string name: string - created_from: 'api' | 'web' + created_from: 'rag-pipeline' | 'api' | 'web' created_by: string created_at: number indexing_status: DocumentIndexingStatus @@ -403,7 +403,6 @@ export type SimpleDocumentDetail = InitialDocumentDetail & { } } doc_metadata?: MetadataItemWithValue[] - created_from: 'rag-pipeline' | 'web' } export type DocumentListResponse = { From 92a91d790f8577695eaa7fd04e50275e2c220444 Mon Sep 17 00:00:00 2001 From: twwu Date: Wed, 10 Sep 2025 11:06:07 +0800 Subject: [PATCH 4/6] refactor: Rename createRouter to createRoute --- web/app/components/header/dataset-nav/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/app/components/header/dataset-nav/index.tsx b/web/app/components/header/dataset-nav/index.tsx index 96879ec08d..774857e058 100644 --- a/web/app/components/header/dataset-nav/index.tsx +++ b/web/app/components/header/dataset-nav/index.tsx @@ -61,7 +61,7 @@ const DatasetNav = () => { }) as NavItem[] }, [datasetItems]) - const createRouter = useMemo(() => { + const createRoute = useMemo(() => { const runtimeMode = currentDataset?.runtime_mode if (runtimeMode === 'rag_pipeline') return `${basePath}/datasets/create-from-pipeline` @@ -85,7 +85,7 @@ const DatasetNav = () => { curNav={curNav} navigationItems={navigationItems} createText={t('common.menus.newDataset')} - onCreate={() => router.push(createRouter)} + onCreate={() => router.push(createRoute)} onLoadMore={handleLoadMore} /> ) From bc061016b6696d5deb2325a0c613bba1886f6b0c Mon Sep 17 00:00:00 2001 From: twwu Date: Wed, 10 Sep 2025 11:11:27 +0800 Subject: [PATCH 5/6] refactor: Extract getDatasetLink function into separate callback --- .../datasets/common/credential-icon.tsx | 2 +- .../components/header/dataset-nav/index.tsx | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/web/app/components/datasets/common/credential-icon.tsx b/web/app/components/datasets/common/credential-icon.tsx index cbcd045738..5a25963f3b 100644 --- a/web/app/components/datasets/common/credential-icon.tsx +++ b/web/app/components/datasets/common/credential-icon.tsx @@ -21,7 +21,7 @@ export const CredentialIcon: React.FC = ({ size = 20, className = '', }) => { - const [showAvatar, setShowAvatar] = useState(true) + const [showAvatar, setShowAvatar] = useState(!!avatar_url && avatar_url !== 'default') const firstLetter = useMemo(() => name.charAt(0).toUpperCase(), [name]) const bgColor = useMemo(() => ICON_BG_COLORS[firstLetter.charCodeAt(0) % ICON_BG_COLORS.length], [firstLetter]) diff --git a/web/app/components/header/dataset-nav/index.tsx b/web/app/components/header/dataset-nav/index.tsx index 774857e058..c7ae169de1 100644 --- a/web/app/components/header/dataset-nav/index.tsx +++ b/web/app/components/header/dataset-nav/index.tsx @@ -12,6 +12,7 @@ import Nav from '../nav' import type { NavItem } from '../nav/nav-selector' import { basePath } from '@/utils/var' import { useDatasetDetail, useDatasetList } from '@/service/knowledge/use-dataset' +import type { DataSet } from '@/models/datasets' const DatasetNav = () => { const { t } = useTranslation() @@ -40,15 +41,19 @@ const DatasetNav = () => { } as Omit }, [currentDataset?.id, currentDataset?.name, currentDataset?.icon_info]) + const getDatasetLink = useCallback((dataset: DataSet) => { + const isPipelineUnpublished = dataset.runtime_mode === 'rag_pipeline' && !dataset.is_published + const link = isPipelineUnpublished + ? `/datasets/${dataset.id}/pipeline` + : `/datasets/${dataset.id}/documents` + return dataset.provider === 'external' + ? `/datasets/${dataset.id}/hitTesting` + : link + }, []) + const navigationItems = useMemo(() => { return datasetItems.map((dataset) => { - const isPipelineUnpublished = dataset.runtime_mode === 'rag_pipeline' && !dataset.is_published - const internalLink = isPipelineUnpublished - ? `/datasets/${dataset.id}/pipeline` - : `/datasets/${dataset.id}/documents` - const link = dataset.provider === 'external' - ? `/datasets/${dataset.id}/hitTesting` - : internalLink + const link = getDatasetLink(dataset) return { id: dataset.id, name: dataset.name, @@ -59,7 +64,7 @@ const DatasetNav = () => { icon_url: dataset.icon_info.icon_url, } }) as NavItem[] - }, [datasetItems]) + }, [datasetItems, getDatasetLink]) const createRoute = useMemo(() => { const runtimeMode = currentDataset?.runtime_mode From c295b1d6457193bd90858a7598aa4160ceed4095 Mon Sep 17 00:00:00 2001 From: jyong <718720800@qq.com> Date: Wed, 10 Sep 2025 13:50:12 +0800 Subject: [PATCH 6/6] fix user_id missed --- api/core/app/apps/workflow/app_runner.py | 1 + 1 file changed, 1 insertion(+) diff --git a/api/core/app/apps/workflow/app_runner.py b/api/core/app/apps/workflow/app_runner.py index 64ed9369d2..b009dc7715 100644 --- a/api/core/app/apps/workflow/app_runner.py +++ b/api/core/app/apps/workflow/app_runner.py @@ -105,6 +105,7 @@ class WorkflowAppRunner(WorkflowBasedAppRunner): graph_runtime_state=graph_runtime_state, workflow_id=self._workflow.id, tenant_id=self._workflow.tenant_id, + user_id=self.application_generate_entity.user_id, ) # RUN WORKFLOW