Workbench

扩展插件的侧栏与底部面板

在当前插件的左侧、右侧或底部提供说明、状态和操作,复用 Content、View 与 Attachment。

需要让操作指南、状态或辅助工具跟随当前插件时,使用 workbench.panel()。需要独立地址、长期编辑或多份草稿时, 使用 tab() 或 route() 提供文档入口。面板是当前插件的临时工具,不承担文档草稿恢复。

需求放置位置
插件级集合导航、说明左侧面板
插件级状态、辅助操作右侧面板
辅助工具、最近产物底部扩展面板
当前实体详情、编辑器、需要保存的草稿中央文档

先让核心任务在中央文档完成,确有辅助任务才声明面板;不要在三个区域重复同一份列表或操作。

最短完整声明

下面在左侧添加一个静态说明面板。沿用 Content 的 Markdown 编译与发布方式:

// src/workbench.ts
import { workbench } from '@pluxel/workbench'

export const ReportsWorkbench = workbench.define({
	guide: workbench.content({
		document: workbench.markdown(import.meta.url, './guide.md'),
		placement: workbench.panel('left', { label: '操作指南', order: 10 }),
	}),
})

src/guide.md:

# 生成报表

在插件的报表页面输入标题并生成预览。遇到失败时,打开插件信息检查依赖,再查看插件日志。

在所属 Plugin 的 init() 中发布一次:

this.ctx.workbench?.publish(ReportsWorkbench)

纯 Markdown 不需要 binding、RPC root 或 renderer。打开该插件的配置或业务文档后,从右侧“插件信息”的扩展列表, 或顶部“查找入口”选择“操作指南”,即可在左侧打开独立面板标签。选择面板不改变文档地址。

选择区域与内容

workbench.panel('left', { label: '操作指南' })
workbench.panel('right', { label: '渲染状态', icon: workbench.icons.ChartBar })
workbench.panel('bottom', { label: '最近产物', order: 20 })

区域只能是 left、right 或 bottom;label 必填,icon 与 order 可省略。它不接受路径、navigation 或 publication group。 可用面板入口按 order 排序,默认按需打开;重复打开聚焦已有标签。它们不加入官方入口栏,也不成为独立文档。 插件管理的左侧目录和右侧官方信息/日志保留各自职责,扩展使用独立原生标签,不混入官方工具内部。

  • 说明、最新状态和少量操作使用 Content。将原来的 placement 换成 panel(),data/action 的声明和 binding 不变。
  • 自定义交互、流式输出或复杂工具使用 View。renderer 与每次打开的 API 仍由现有 View 契约管理。
  • 复用其他插件的界面使用 Attachment,例如 ProviderWorkbench.settings.place(workbench.panel('right', { label: '设置' }))。 面板跟随放置它的 consumer 插件,API 与 renderer 仍由 provider 拥有。

面板没有中心文档的 host.document 能力,不能借面板修改文档标题或脏状态;需要导航时使用现有 host.navigation。

关闭与重新打开

插件面板可以关闭,并在声明的区域内拖动排序;不能跨区域或拖入中央文档。关闭后可从“插件信息”的扩展列表或顶部查找重新打开。两个入口展示相同的当前插件声明,停止插件或已撤回的声明不会提供虚假的可打开入口。

收起区域保留已打开标签,关闭面板则移除标签。切换插件时,工作台保留各插件未关闭的面板布局;切回或刷新会恢复未关闭标签,但不会重新打开用户已关闭的面板。已保存而声明撤回的标签显示不可用,可直接关闭。

底部没有官方默认工具,只在打开了该插件的底部面板时出现。左边只有官方目录时不额外显示竖标签条,有插件面板时显示原生标签条。右侧官方“插件面板”内部的信息和最近日志不受插件面板关闭影响。

数据与清理

面板按当前活动文档所属的 canonical Plugin node 筛选,包括 fork;切换到其他插件时,原插件面板会卸载。 关闭面板、同一区域切换面板、收起区域或布局隐藏内容时,也会释放当前面板的 opened handle、renderer 与订阅。 再次显示重新打开并读取最新数据,未提交表单和临时组件状态不保证保留。

含 data 的 Content 使用现有 load() 与 dataChanged();领域 listener 必须随打开时的 signal 清理, 具体完整模式见 Content 的 live refresh。 View 使用相同的 per-open signal 与资源清理规则,不缓存旧面板的 API root 供下一次打开复用。 Plugin 停止、替换或撤回 publication 时,面板仍遵守原有 owner admission 与会话失效契约。

工作区保存各插件未关闭的面板及布局,不保存面板业务草稿;需要保留输入的功能应由业务自己保存,或放到独立文档中。

集合、实体与多个文档

例如机器人管理应用,可将机器人集合页声明为带 navigation 的 route(),从官方“应用”目录进入。 单个机器人或会话使用参数化路由,由业务列表选择实体并构造具体地址。需要并行处理时,通过活动标签后的“+”复制当前地址, 再在新文档选择另一个实体。文档有独立路由和页面状态,但“+”不复制未保存的输入;普通入口在当前文档中导航。

当前面板上下文是 canonical Plugin owner,不是机器人、会话或其他实体。切换同一插件内两个实体文档,不会自动把活动路由参数传给面板。 左侧面板适合该插件的集合导航,右侧和底部可显示插件级状态;实体详情、未提交配置与需要随实体变化的操作应放在中心文档中。 不要让面板通过浏览器地址猜测当前实体,也不要依赖面板获得中心文档的 host.document 能力。

工作区示例与检查

参考应用 projects/plugin-host 的 ReportStudioWorkbench 声明了三个 Content 面板:

key区域与标签数据来源
studioGuide左侧“操作指南”静态 Markdown 的真实操作说明
studioStatus右侧“渲染状态”当前 ReportStudio 的提供者与缓存统计
studioArtifacts底部“最近产物”当前 ReportStudio 最近八份产物

打开 Architecture Lab,从“插件信息”的扩展列表或顶部查找打开对应面板;生成报表后,渲染状态和最近产物应更新。 切换插件或收起区域后,原面板订阅应释放;再次显示应重新读取当前插件数据。类型检查和声明编译不能代替这条在线验证。

最后更新于

本页目录