diff --git a/src/components/modelAlias/ModelMappingDiagram.tsx b/src/components/modelAlias/ModelMappingDiagram.tsx index 0425ba9..d179b0c 100644 --- a/src/components/modelAlias/ModelMappingDiagram.tsx +++ b/src/components/modelAlias/ModelMappingDiagram.tsx @@ -274,6 +274,7 @@ export const ModelMappingDiagram = forwardRef Alias const handleDragStart = (e: DragEvent, source: SourceNode) => { setDraggedSource(source); + e.dataTransfer.setData('text/plain', source.id); e.dataTransfer.effectAllowed = 'link'; }; @@ -300,6 +301,7 @@ export const ModelMappingDiagram = forwardRef Source const handleDragStartAlias = (e: DragEvent, alias: string) => { setDraggedAlias(alias); + e.dataTransfer.setData('text/plain', alias); e.dataTransfer.effectAllowed = 'link'; }; @@ -429,7 +431,7 @@ export const ModelMappingDiagram = forwardRef { e.preventDefault(); diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index d00d49d..c748757 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -578,8 +578,8 @@ "diagram_settings_source_title": "源模型设置", "diagram_settings_empty": "该别名暂无映射。", "view_mode": "视图模式", - "view_mode_diagram": "Diagram", - "view_mode_list": "List", + "view_mode_diagram": "概览", + "view_mode_list": "管理", "provider_required": "请先填写提供商名称", "upgrade_required": "当前 CPA 版本不支持模型别名功能,请升级 CPA 版本", "upgrade_required_title": "需要升级 CPA 版本", diff --git a/src/pages/AuthFilesOAuthModelAliasEditPage.tsx b/src/pages/AuthFilesOAuthModelAliasEditPage.tsx index aee8a16..35e617c 100644 --- a/src/pages/AuthFilesOAuthModelAliasEditPage.tsx +++ b/src/pages/AuthFilesOAuthModelAliasEditPage.tsx @@ -40,7 +40,7 @@ const buildEmptyMappingEntry = (): OAuthModelMappingFormEntry => ({ id: generateId(), name: '', alias: '', - fork: false, + fork: true, }); const normalizeMappingEntries = ( diff --git a/src/pages/AuthFilesPage.tsx b/src/pages/AuthFilesPage.tsx index 0e91fa0..8cc7785 100644 --- a/src/pages/AuthFilesPage.tsx +++ b/src/pages/AuthFilesPage.tsx @@ -271,6 +271,8 @@ export function AuthFilesPage() { }, [files, modelAlias]); useEffect(() => { + if (viewMode !== 'diagram') return; + let cancelled = false; const loadAllModels = async () => { @@ -307,7 +309,7 @@ export function AuthFilesPage() { return () => { cancelled = true; }; - }, [providerList]); + }, [providerList, viewMode]); @@ -1200,8 +1202,11 @@ export function AuthFilesPage() { if (providersToUpdate.length === 0) return; + let hadFailure = false; + let failureMessage = ''; + try { - await Promise.all( + const results = await Promise.allSettled( providersToUpdate.map(([provider, mappings]) => { const nextMappings = mappings.map((m) => (m.alias ?? '').trim().toLowerCase() === oldKey ? { ...m, alias: newTrim } : m @@ -1209,11 +1214,29 @@ export function AuthFilesPage() { return authFilesApi.saveOauthModelAlias(provider, nextMappings); }) ); + + const failures = results.filter( + (result): result is PromiseRejectedResult => result.status === 'rejected' + ); + + if (failures.length > 0) { + hadFailure = true; + const reason = failures[0].reason; + failureMessage = reason instanceof Error ? reason.message : String(reason ?? ''); + } + } finally { await loadModelAlias(); + } + + if (hadFailure) { + showNotification( + failureMessage + ? `${t('oauth_model_alias.save_failed')}: ${failureMessage}` + : t('oauth_model_alias.save_failed'), + 'error' + ); + } else { showNotification(t('oauth_model_alias.save_success'), 'success'); - } catch (err: unknown) { - const errorMessage = err instanceof Error ? err.message : ''; - showNotification(`${t('oauth_model_alias.save_failed')}: ${errorMessage}`, 'error'); } }; @@ -1239,8 +1262,11 @@ export function AuthFilesPage() { variant: 'danger', confirmText: t('common.confirm'), onConfirm: async () => { + let hadFailure = false; + let failureMessage = ''; + try { - await Promise.all( + const results = await Promise.allSettled( providersToUpdate.map(([provider, mappings]) => { const nextMappings = mappings.filter( (m) => (m.alias ?? '').trim().toLowerCase() !== aliasKey @@ -1251,11 +1277,29 @@ export function AuthFilesPage() { return authFilesApi.saveOauthModelAlias(provider, nextMappings); }) ); + + const failures = results.filter( + (result): result is PromiseRejectedResult => result.status === 'rejected' + ); + + if (failures.length > 0) { + hadFailure = true; + const reason = failures[0].reason; + failureMessage = reason instanceof Error ? reason.message : String(reason ?? ''); + } + } finally { await loadModelAlias(); + } + + if (hadFailure) { + showNotification( + failureMessage + ? `${t('oauth_model_alias.delete_failed')}: ${failureMessage}` + : t('oauth_model_alias.delete_failed'), + 'error' + ); + } else { showNotification(t('oauth_model_alias.delete_success'), 'success'); - } catch (err: unknown) { - const errorMessage = err instanceof Error ? err.message : ''; - showNotification(`${t('oauth_model_alias.delete_failed')}: ${errorMessage}`, 'error'); } }, });