From 2f6c3175a372c0737317ab5a43d2a9413df0e23a Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Fri, 24 Jul 2026 23:55:18 +0200 Subject: [PATCH] feat: add standalone AI assistant window button - Add ExternalLink button to AI assistant toolbar - New route /ai-assistant-standalone renders AIAssistantPage without sidebar - Opens in new browser window via window.open --- frontend/src/pages/AIAssistant.tsx | 15 ++++++++++++++- frontend/src/pages/AIAssistantStandalone.tsx | 10 ++++++++++ frontend/src/routes/index.tsx | 5 +++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 frontend/src/pages/AIAssistantStandalone.tsx diff --git a/frontend/src/pages/AIAssistant.tsx b/frontend/src/pages/AIAssistant.tsx index 0e6ddb2..5df207c 100644 --- a/frontend/src/pages/AIAssistant.tsx +++ b/frontend/src/pages/AIAssistant.tsx @@ -4,7 +4,7 @@ import { ChatWindow } from '@/components/ai/ChatWindow'; import { ResizablePanel } from '@/components/ui/ResizablePanel'; import { usePluginToolbarStore } from '@/store/pluginToolbarStore'; import { fetchAgents, createSession, type AIAgent } from '@/api/ai'; -import { ChevronLeft, Folder, Plus } from 'lucide-react'; +import { ChevronLeft, ExternalLink, Folder, Plus } from 'lucide-react'; export function AIAssistantPage() { const [activeSessionId, setActiveSessionId] = useState(null); @@ -67,6 +67,19 @@ export function AIAssistantPage() { } }, }, + { + id: 'open-standalone', + plugin: 'ai_assistant', + label: 'In neuem Fenster', + type: 'button', + group: 'actions', + icon: ( + + ), + onClick: () => { + window.open('/ai-assistant-standalone', '_blank', 'width=800,height=600'); + }, + }, ]); return () => unregisterPlugin('ai_assistant'); }, [agents, selectedAgentId, registerItems, unregisterPlugin]); diff --git a/frontend/src/pages/AIAssistantStandalone.tsx b/frontend/src/pages/AIAssistantStandalone.tsx new file mode 100644 index 0000000..0e78992 --- /dev/null +++ b/frontend/src/pages/AIAssistantStandalone.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { AIAssistantPage } from './AIAssistant'; + +export function AIAssistantStandalonePage() { + return ( +
+ +
+ ); +} diff --git a/frontend/src/routes/index.tsx b/frontend/src/routes/index.tsx index 3306010..b65dc53 100644 --- a/frontend/src/routes/index.tsx +++ b/frontend/src/routes/index.tsx @@ -36,6 +36,7 @@ const AISettingsPage = React.lazy(() => import('@/pages/AISettings').then(m => ( const ProactiveAISettings = React.lazy(() => import('@/pages/ProactiveAISettings').then(m => ({ default: m.ProactiveAISettings }))); const SettingsThemePage = React.lazy(() => import('@/pages/SettingsTheme').then(m => ({ default: m.SettingsThemePage }))); const SettingsMcpPage = React.lazy(() => import('@/pages/SettingsMcp').then(m => ({ default: m.SettingsMcpPage }))); +const AIAssistantStandalonePage = React.lazy(() => import('@/pages/AIAssistantStandalone').then(m => ({ default: m.AIAssistantStandalonePage }))); const SettingsAIPage = React.lazy(() => import('@/pages/SettingsAI').then(m => ({ default: m.SettingsAIPage }))); const SettingsMenuOrderPage = React.lazy(() => import('@/pages/SettingsMenuOrder').then(m => ({ default: m.SettingsMenuOrderPage }))); const SettingsStammdatenPage = React.lazy(() => import('@/pages/SettingsStammdaten').then(m => ({ default: m.SettingsStammdatenPage }))); @@ -65,6 +66,10 @@ const router = createBrowserRouter([ path: '/login', element: , }, + { + path: '/ai-assistant-standalone', + element: withSuspense(), + }, { path: '/password-reset', element: ,