diff --git a/static/src/components/sidebar/ConversationSidebar.vue b/static/src/components/sidebar/ConversationSidebar.vue index 644ec941..a2c04dea 100644 --- a/static/src/components/sidebar/ConversationSidebar.vue +++ b/static/src/components/sidebar/ConversationSidebar.vue @@ -994,6 +994,12 @@ watch( { immediate: true, deep: true } ); +const isGroupByWorkspaceActive = computed( + () => props.groupByWorkspace && props.hostWorkspaceEnabled && Array.isArray(props.workspaces) && props.workspaces.length > 0 +); + +/* 注意:本 watcher 声明必须放在 isGroupByWorkspaceActive 之后—— + immediate 回调会在 setup 阶段同步执行,提前引用会触发 TDZ 报错。 */ watch( () => props.currentWorkspaceId, async () => { @@ -1011,10 +1017,6 @@ watch( }, { immediate: true } ); - -const isGroupByWorkspaceActive = computed( - () => props.groupByWorkspace && props.hostWorkspaceEnabled && Array.isArray(props.workspaces) && props.workspaces.length > 0 -); const sortedWorkspaces = computed(() => { const list = Array.isArray(props.workspaces) ? [...props.workspaces] : []; return list.sort((a: any, b: any) => { diff --git a/static/src/components/sidebar/WorkspaceSwitcher.vue b/static/src/components/sidebar/WorkspaceSwitcher.vue index 63af8573..afd668de 100644 --- a/static/src/components/sidebar/WorkspaceSwitcher.vue +++ b/static/src/components/sidebar/WorkspaceSwitcher.vue @@ -400,6 +400,10 @@ watch( const onDocClick = (event: MouseEvent) => { const target = event.target as Node | null; if (!target) return; + /* 二级菜单 teleport 到 body、与 popoverEl 是兄弟节点;capture 阶段会先于此处 + 触发,若不排除会导致点击菜单项(删除/重命名)时整个浮层先被关闭, + 菜单动作设置的内联状态(deletingId/renamingId)永远不可见。 */ + if ((target as Element).closest?.('.ws-menu-floating')) return; if (popoverEl.value && !popoverEl.value.contains(target)) { /* 点击入口按钮:交给按钮自身的 toggle 处理(已展开则收起), 避免 capture 阶段先 close、按钮 click 又重新打开导致重播动画 */ @@ -698,6 +702,7 @@ onBeforeUnmount(() => { .ws-confirm-actions { display: flex; + justify-content: flex-end; gap: 8px; }