From 55cb84e27bb17577c183d70e9245daaba26dca8b Mon Sep 17 00:00:00 2001 From: shanyuhai123 <864299347@qq.com> Date: Thu, 8 Oct 2026 23:50:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(buddy):=20=E6=94=AF=E6=8C=81=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E9=9D=A2=E6=9D=BF=E6=94=BE=E5=A4=A7=E4=B8=8E=E5=B7=A6?= =?UTF-8?q?=E5=8F=B3=E6=8D=A2=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__tests__/extensionContributions.e2e.mjs | 9 ++ .../app/workbench/DesktopWorkbenchArea.vue | 29 ++++--- apps/buddy/src/i18n/locales/en-US/tasks.ts | 4 + apps/buddy/src/i18n/locales/zh-CN/tasks.ts | 4 + .../settings/pages/DesktopSettingsLayout.vue | 4 +- .../context-panel/DesktopTaskContextPanel.vue | 5 +- .../DesktopTaskResourcePanel.vue | 3 + .../src/workbench/browser/WorkbenchHost.vue | 18 ++-- .../browser/WorkbenchResourcePanel.vue | 19 ++++- .../browser/WorkbenchResourcePanelActions.vue | 53 ++++++++++++ .../browser/layout/WorkbenchLayout.vue | 82 +++++++++++++------ .../layout/useWorkbenchPanelPresentation.ts | 48 +++++++++++ .../browser/layout/useWorkbenchPanelResize.ts | 16 ++-- .../src/workbench/browser/workbenchContext.ts | 2 + .../__tests__/workbenchPanelLayout.spec.ts | 30 ++++++- 15 files changed, 274 insertions(+), 52 deletions(-) create mode 100644 apps/buddy/src/workbench/browser/WorkbenchResourcePanelActions.vue create mode 100644 apps/buddy/src/workbench/browser/layout/useWorkbenchPanelPresentation.ts diff --git a/.playwright/scripts/__tests__/extensionContributions.e2e.mjs b/.playwright/scripts/__tests__/extensionContributions.e2e.mjs index 3743126fa..d334f7673 100644 --- a/.playwright/scripts/__tests__/extensionContributions.e2e.mjs +++ b/.playwright/scripts/__tests__/extensionContributions.e2e.mjs @@ -49,6 +49,15 @@ test('plugin-owned preferences activate contributions, yield native content and await expect(alpha.getByText('tests.alpha content')).toBeVisible() await expect(nativeFooter()).toHaveCount(0) const identity = await alpha.evaluate(() => window.fixture.instance) + await page.getByTestId('context-panel-toggle').click() + await page.getByTestId('context-panel-swap').click() + await page.getByTestId('context-panel-maximize').click() + await expect.poll(() => visible('alpha')).toBe(false) + await page.getByTestId('context-panel-maximize').click() + await expect.poll(() => visible('alpha')).toBe(true) + expect(await alpha.evaluate(() => window.fixture.instance)).toBe(identity) + await page.getByTestId('context-panel-swap').click() + await page.getByTestId('context-panel-toggle').click() const alphaActions = await pluginFrame('alpha', 'actions') await alphaActions.getByRole('checkbox', { name: 'Content tests.alpha' }).uncheck() await expect(nativeFooter()).toBeVisible() diff --git a/apps/buddy/src/app/workbench/DesktopWorkbenchArea.vue b/apps/buddy/src/app/workbench/DesktopWorkbenchArea.vue index 47a8f15c7..3998b4093 100644 --- a/apps/buddy/src/app/workbench/DesktopWorkbenchArea.vue +++ b/apps/buddy/src/app/workbench/DesktopWorkbenchArea.vue @@ -3,18 +3,22 @@ import type { ComponentPublicInstance } from 'vue' import type { DesktopShellBindings } from '../shell/desktopShellBindings' import { NSpin } from 'naive-ui' import { computed, watch } from 'vue' -import { RouterView } from 'vue-router' +import { RouterView, useRoute } from 'vue-router' import { DesktopTaskIndexView, DesktopTaskResourcePanel } from '@/modules/tasks/ui' import { useDesktopUi } from '@/shared/ui/desktopUiContext' import WorkbenchLayout from '@/workbench/browser/layout/WorkbenchLayout.vue' import WorkbenchMountPoint from '@/workbench/browser/mounts/WorkbenchMountPoint.vue' import { useWorkbench } from '@/workbench/browser/workbenchContext' import WorkbenchLayoutNode from '@/workbench/browser/WorkbenchLayoutNode.vue' +import WorkbenchResourcePanelActions from '@/workbench/browser/WorkbenchResourcePanelActions.vue' import WorkbenchSurface from '@/workbench/browser/WorkbenchSurface.vue' import DesktopDirectoryFileSurface from './DesktopDirectoryFileSurface.vue' const props = defineProps<{ bindings: DesktopShellBindings, tasksVisible: boolean }>() -const { controller, layout, revision, labels } = useWorkbench() +const { controller, layout, revision, labels, panels } = useWorkbench() +const route = useRoute() +const contextVisible = computed(() => (props.tasksVisible || props.bindings.contextPanelGlobal.value) && props.bindings.resources.isOpen.value) +watch([contextVisible, () => route.path], panels.restore) const pendingTaskIds = computed(() => { void revision.value return [...controller.navigation.entries.values()].filter(entry => entry.status === 'loading' && entry.view.resource.scheme === 'task').map(entry => entry.view.resource.id) @@ -49,27 +53,32 @@ function focusContext() { diff --git a/apps/buddy/src/modules/tasks/widgets/context-panel/DesktopTaskResourcePanel.vue b/apps/buddy/src/modules/tasks/widgets/context-panel/DesktopTaskResourcePanel.vue index b3516d150..423209164 100644 --- a/apps/buddy/src/modules/tasks/widgets/context-panel/DesktopTaskResourcePanel.vue +++ b/apps/buddy/src/modules/tasks/widgets/context-panel/DesktopTaskResourcePanel.vue @@ -58,6 +58,9 @@ function add(kind: 'changes' | 'files' | 'browser') {