fix(pro-workspace): restore tool/variable/favorite actions via provide/inject

Migrate Pro workspace event handlers from emit to provide/inject pattern
to fix broken event chain introduced by RouterView refactoring (2b669b9d).

Fixed actions:
- openToolManager: tool management modal not opening (#293)
- openVariableManager: variable manager not accessible
- handleSaveFavorite: save-to-favorite not working in Pro mode
- saveToGlobal: save temporary variable to global failing
- openPromptPreview: prompt preview panel not opening

Pattern: provide('key', handler) in PromptOptimizerApp, inject with
emit fallback in ContextSystemWorkspace and ContextUserWorkspace.
This commit is contained in:
linshen
2026-05-04 13:35:06 +08:00
parent 31ef76718a
commit 78398eba4b
3 changed files with 82 additions and 5 deletions

View File

@@ -1749,6 +1749,28 @@ void registerOptionalIntegrations({
});
provide("handleSaveFavorite", handleSaveFavorite);
// 提供 openToolManager 接口(供 Pro 工作区直接调用)
provide("openToolManager", () => {
showToolManager.value = true;
});
// 提供 openVariableManager 接口(供 Pro 工作区直接调用)
provide("openVariableManager", (variableName?: string) => {
handleOpenVariableManager(variableName);
});
// 提供 saveToGlobal 接口(供 Pro 工作区将临时变量保存到全局)
provide("saveToGlobal", (name: string, value: string) => {
variableManager?.customVariables?.value
? (variableManager.customVariables.value[name] = value)
: undefined;
});
// 提供 openPromptPreview 接口(供 Pro 工作区打开提示词预览面板)
provide("openPromptPreview", () => {
showPreviewPanel.value = true;
});
// 模板管理器
const templateManagerState = useTemplateManager(services);

View File

@@ -40,9 +40,9 @@
:scan-variables="scanVariables"
:optimization-mode="optimizationMode"
:tool-count="toolCount"
@open-variable-manager="emit('open-variable-manager')"
@open-variable-manager="handleOpenVariableManager"
@open-context-editor="handleOpenContextEditor"
@open-tool-manager="emit('open-tool-manager')"
@open-tool-manager="handleOpenToolManager"
:enable-tool-management="true"
:collapsible="true"
:max-height="300"
@@ -131,7 +131,7 @@
@openTemplateManager="handleOpenTemplateManager"
@switchVersion="handleSwitchVersion"
@switchToV0="handleSwitchToV0"
@save-favorite="emit('save-favorite', $event)"
@save-favorite="handleSaveFavorite"
@open-preview="handleOpenPromptPreview"
@apply-to-conversation="handleApplyToConversation"
@apply-improvement="handleApplyImprovement"
@@ -174,7 +174,7 @@
:input-mode="inputMode"
:button-size="buttonSize"
@variable-change="handleVariableChange"
@save-to-global="(name: string, value: string) => emit('save-to-global', name, value)"
@save-to-global="handleSaveToGlobal"
@temporary-variable-remove="handleVariableRemove"
@temporary-variables-clear="handleVariablesClear"
/>
@@ -681,6 +681,13 @@ const appOpenContextEditor = inject<
((messagesOrTab?: ContextEditorOpenArg, variables?: Record<string, string>) => void) | null
>('openContextEditor', null)
// 注入 App 层统一的 open* 接口Pro 工作区专有功能)
const appOpenToolManager = inject<(() => void) | null>('openToolManager', null)
const appOpenVariableManager = inject<((variableName?: string) => void) | null>('openVariableManager', null)
const appHandleSaveFavorite = inject<((data: SaveFavoritePayload) => void) | null>('handleSaveFavorite', null)
const appSaveToGlobal = inject<((name: string, value: string) => void) | null>('saveToGlobal', null)
const appOpenPromptPreview = inject<(() => void) | null>('openPromptPreview', null)
// Pro Multi: message list is session-owned (per-submode isolation).
// Keep emitting update:optimizationContext only as a backward-compat hook for non-App hosts.
const proMultiSession = useProMultiMessageSession()
@@ -733,6 +740,27 @@ const handleOpenContextEditor = (
emit('open-context-editor')
}
// Pro 工作区专有功能的处理函数(优先使用 injectemit 作为兜底)
const handleOpenToolManager = () => {
if (appOpenToolManager) { appOpenToolManager(); return; }
emit('open-tool-manager')
}
const handleOpenVariableManager = () => {
if (appOpenVariableManager) { appOpenVariableManager(); return; }
emit('open-variable-manager')
}
const handleSaveFavorite = (data: SaveFavoritePayload) => {
if (appHandleSaveFavorite) { appHandleSaveFavorite(data); return; }
emit('save-favorite', data)
}
const handleSaveToGlobal = (name: string, value: string) => {
if (appSaveToGlobal) { appSaveToGlobal(name, value); return; }
emit('save-to-global', name, value)
}
// ✅ 优化模式:固定为 'system'(此组件专门用于系统模式优化)
const optimizationMode: OptimizationMode = 'system';

View File

@@ -185,7 +185,7 @@
@openTemplateManager="handleOpenTemplateManager"
@switchVersion="handleSwitchVersion"
@switchToV0="handleSwitchToV0"
@save-favorite="emit('save-favorite', $event)"
@save-favorite="handleSaveFavorite"
@open-preview="handleOpenPromptPreview"
@apply-improvement="handleApplyImprovement"
@save-local-edit="handleSaveLocalEdit"
@@ -667,6 +667,8 @@ const emit = defineEmits<{
// --- 打开面板/管理器 ---
/** 打开变量管理器 */
"open-variable-manager": [];
/** 打开工具管理器 */
"open-tool-manager": [];
/** 打开模板管理器 */
"open-template-manager": [type?: string];
/** 配置模型 */
@@ -720,6 +722,13 @@ const appOpenTemplateManager = inject<((type?: string) => void) | null>(
null,
)
// 注入 App 层统一的 open* 接口Pro 工作区专有功能)
const appOpenToolManager = inject<(() => void) | null>('openToolManager', null)
const appOpenVariableManager = inject<((variableName?: string) => void) | null>('openVariableManager', null)
const appHandleSaveFavorite = inject<((data: SaveFavoritePayload) => void) | null>('handleSaveFavorite', null)
const appSaveToGlobal = inject<((name: string, value: string) => void) | null>('saveToGlobal', null)
const appOpenPromptPreview = inject<(() => void) | null>('openPromptPreview', null)
const handleOpenModelManager = () => {
if (appOpenModelManager) {
appOpenModelManager('text')
@@ -738,6 +747,22 @@ const handleOpenTemplateManager = (typeOrPayload?: string | Record<string, unkno
emit('open-template-manager', type)
}
// Pro 工作区专有功能的处理函数(优先使用 injectemit 作为兜底)
const handleOpenToolManager = () => {
if (appOpenToolManager) { appOpenToolManager(); return; }
emit('open-tool-manager')
}
const handleOpenVariableManager = () => {
if (appOpenVariableManager) { appOpenVariableManager(); return; }
emit('open-variable-manager')
}
const handleSaveFavorite = (data: SaveFavoritePayload) => {
if (appHandleSaveFavorite) { appHandleSaveFavorite(data); return; }
emit('save-favorite', data)
}
// ========================
// 内部状态管理
// ========================
@@ -1996,6 +2021,7 @@ const {
temporaryVariables: computed(() => ({ ...temporaryVariables.value })),
predefinedVariables,
saveGlobalVariable: (name, value) => {
if (appSaveToGlobal) { appSaveToGlobal(name, value); return; }
if (variableManager?.isReady.value) {
variableManager.addVariable(name, value)
}
@@ -2007,6 +2033,7 @@ const {
})
const handleSaveToGlobalFromTest = (name: string, value: string) => {
if (appSaveToGlobal) { appSaveToGlobal(name, value); return; }
if (variableManager?.isReady.value) {
variableManager.addVariable(name, value)
}