From 618981f1ae13db31333075bcab7d62a0cce7a457 Mon Sep 17 00:00:00 2001 From: CorrectRoad Date: Tue, 20 May 2025 16:44:51 +0800 Subject: [PATCH] fix: fix duplicate app lose custom image (#19775) --- api/controllers/console/app/app.py | 2 ++ api/services/app_dsl_service.py | 10 ++++++++-- web/app/(commonLayout)/apps/AppCard.tsx | 4 +++- web/app/components/app/duplicate-modal/index.tsx | 2 ++ web/service/apps.ts | 8 ++++---- 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/api/controllers/console/app/app.py b/api/controllers/console/app/app.py index 860166a61a..1f532ee027 100644 --- a/api/controllers/console/app/app.py +++ b/api/controllers/console/app/app.py @@ -192,6 +192,7 @@ class AppCopyApi(Resource): parser.add_argument("icon_type", type=str, location="json") parser.add_argument("icon", type=str, location="json") parser.add_argument("icon_background", type=str, location="json") + parser.add_argument("icon_url", type=str, location="json") args = parser.parse_args() with Session(db.engine) as session: @@ -206,6 +207,7 @@ class AppCopyApi(Resource): description=args.get("description"), icon_type=args.get("icon_type"), icon=args.get("icon"), + icon_url=args.get("icon_url"), icon_background=args.get("icon_background"), ) session.commit() diff --git a/api/services/app_dsl_service.py b/api/services/app_dsl_service.py index d2875180d8..370aead7f1 100644 --- a/api/services/app_dsl_service.py +++ b/api/services/app_dsl_service.py @@ -100,6 +100,7 @@ class PendingData(BaseModel): description: str | None icon_type: str | None icon: str | None + icon_url: str | None icon_background: str | None app_id: str | None @@ -124,6 +125,7 @@ class AppDslService: description: Optional[str] = None, icon_type: Optional[str] = None, icon: Optional[str] = None, + icon_url: Optional[str] = None, icon_background: Optional[str] = None, app_id: Optional[str] = None, ) -> Import: @@ -248,6 +250,7 @@ class AppDslService: icon_type=icon_type, icon=icon, icon_background=icon_background, + icon_url=icon_url, app_id=app_id, ) redis_client.setex( @@ -288,6 +291,7 @@ class AppDslService: description=description, icon_type=icon_type, icon=icon, + icon_url=icon_url, icon_background=icon_background, dependencies=check_dependencies_pending_data, ) @@ -409,6 +413,7 @@ class AppDslService: description: Optional[str] = None, icon_type: Optional[str] = None, icon: Optional[str] = None, + icon_url: Optional[str] = None, icon_background: Optional[str] = None, dependencies: Optional[list[PluginDependency]] = None, ) -> App: @@ -421,12 +426,12 @@ class AppDslService: # Set icon type icon_type_value = icon_type or app_data.get("icon_type") - if icon_type_value in ["emoji", "link"]: + if icon_type_value in ["emoji", "link", "image"]: icon_type = icon_type_value else: icon_type = "emoji" icon = icon or str(app_data.get("icon", "")) - + icon_url = icon_url or str(app_data.get("icon_url", "")) if app: # Update existing app app.name = name or app_data.get("name", app.name) @@ -434,6 +439,7 @@ class AppDslService: app.icon_type = icon_type app.icon = icon app.icon_background = icon_background or app_data.get("icon_background", app.icon_background) + app.icon_url = icon_url or app_data.get("icon_url", app.icon_url) app.updated_by = account.id else: if account.current_tenant_id is None: diff --git a/web/app/(commonLayout)/apps/AppCard.tsx b/web/app/(commonLayout)/apps/AppCard.tsx index 468c8244c0..d839f014f7 100644 --- a/web/app/(commonLayout)/apps/AppCard.tsx +++ b/web/app/(commonLayout)/apps/AppCard.tsx @@ -111,14 +111,16 @@ const AppCard = ({ app, onRefresh }: AppCardProps) => { } }, [app.id, mutateApps, notify, onRefresh, t]) - const onCopy: DuplicateAppModalProps['onConfirm'] = async ({ name, icon_type, icon, icon_background }) => { + const onCopy: DuplicateAppModalProps['onConfirm'] = async ({ name, icon_type, icon, icon_background, icon_url }) => { try { + console.log('icon_url', icon_url) const newApp = await copyApp({ appID: app.id, name, icon_type, icon, icon_background, + icon_url, mode: app.mode, }) setShowDuplicateModal(false) diff --git a/web/app/components/app/duplicate-modal/index.tsx b/web/app/components/app/duplicate-modal/index.tsx index f98fb831ed..bdf3cd1a07 100644 --- a/web/app/components/app/duplicate-modal/index.tsx +++ b/web/app/components/app/duplicate-modal/index.tsx @@ -24,6 +24,7 @@ export type DuplicateAppModalProps = { onConfirm: (info: { name: string icon_type: AppIconType + icon_url?: string | null icon: string icon_background?: string | null }) => Promise @@ -63,6 +64,7 @@ const DuplicateAppModal = ({ name, icon_type: appIcon.type, icon: appIcon.type === 'emoji' ? appIcon.icon : appIcon.fileId, + icon_url: appIcon.type === 'image' ? appIcon.url : undefined, icon_background: appIcon.type === 'emoji' ? appIcon.background : undefined, }) onHide() diff --git a/web/service/apps.ts b/web/service/apps.ts index d87a98412e..58c2f58b20 100644 --- a/web/service/apps.ts +++ b/web/service/apps.ts @@ -21,12 +21,12 @@ export const createApp: Fetcher('apps', { body: { name, icon_type, icon, icon_background, mode, description, model_config: config } }) } -export const updateAppInfo: Fetcher = ({ appID, name, icon_type, icon, icon_background, description, use_icon_as_answer_icon }) => { - return put(`apps/${appID}`, { body: { name, icon_type, icon, icon_background, description, use_icon_as_answer_icon } }) +export const updateAppInfo: Fetcher = ({ appID, name, icon_type, icon, icon_background, icon_url, description, use_icon_as_answer_icon }) => { + return put(`apps/${appID}`, { body: { name, icon_type, icon, icon_background, icon_url, description, use_icon_as_answer_icon } }) } -export const copyApp: Fetcher = ({ appID, name, icon_type, icon, icon_background, mode, description }) => { - return post(`apps/${appID}/copy`, { body: { name, icon_type, icon, icon_background, mode, description } }) +export const copyApp: Fetcher = ({ appID, name, icon_type, icon, icon_background, icon_url, mode, description }) => { + return post(`apps/${appID}/copy`, { body: { name, icon_type, icon, icon_background, icon_url, mode, description } }) } export const exportAppConfig: Fetcher<{ data: string }, { appID: string; include?: boolean }> = ({ appID, include = false }) => {