Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022
使用扩展通过添加组、页面、菜单操作、观察器或自定义控件来实现工作项窗体的自定义。
小窍门
如果要启动新的 Azure DevOps 扩展,请先尝试这些维护的示例集合 -- 它们适用于当前产品版本并涵盖新式方案(例如,在拉取请求页上添加选项卡)。
- Azure DevOps 扩展示例 (GitHub)-一个演示常见扩展模式的紧凑初学者示例: https://github.com/microsoft/azure-devops-extension-sample
- Azure DevOps 扩展样例(旧版集合和贡献指南),安装以检查用户界面目标或查看源:https://marketplace.visualstudio.com/items/ms-samples.samples-contributions-guide 和 https://github.com/Microsoft/vso-extension-samples/tree/master/contributions-guide
- Microsoft Learn 示例(浏览 Azure DevOps 示例)- 跨 Microsoft 文档的精选、最新的示例:/samples/browse/?terms=azure%20devops%20extension
如果某个示例在组织中不起作用,请将其安装到个人或测试组织中,并将扩展清单的目标 ID 和 API 版本与当前文档进行比较。有关参考和 API,请参阅:
有关完整的源代码,请参阅 GitHub 上的 Azure DevOps 扩展示例中的 UI 示例。
小窍门
有关最新的扩展开发指南,包括主题处理以及从 VSS.SDK 的迁移,请参阅 Azure DevOps 扩展 SDK 开发人员门户。
添加组
若要将组添加到主页,请将贡献添加到具有类型 ms.vss-work-web.work-item-form-group 目标的 ms.vss-work-web.work-item-form扩展清单:
"contributions": [
{
"id": "sample-work-item-form-group",
"type": "ms.vss-work-web.work-item-form-group",
"description": "Custom work item form group",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"name": "My Group",
"uri": "workItemGroup.html",
"height": 600
}
}
]
属性
| 财产 | 说明 |
|---|---|
name |
组中显示的文本。 |
uri |
IFrame 中加载的 HTML 页面的 URI。 |
height |
(可选)组的高度。 默认值为 100%。 |
JavaScript 示例
此示例注册一个提供程序,以响应工作项表单事件。 当工作项加载时,它使用WorkItemFormService读取字段值。
import { IWorkItemFormService, WorkItemTrackingServiceIds } from "azure-devops-extension-api/WorkItemTracking";
import * as SDK from "azure-devops-extension-sdk";
async function getWorkItemFormService(): Promise<IWorkItemFormService> {
return await SDK.getService<IWorkItemFormService>(WorkItemTrackingServiceIds.WorkItemFormService);
}
SDK.init();
SDK.ready().then(() => {
SDK.register(SDK.getContributionId(), () => {
return {
// Called when the active work item is modified
onFieldChanged: (args) => {
console.log("onFieldChanged", JSON.stringify(args));
},
// Called when a new work item is being loaded in the UI
onLoaded: async (args) => {
const service = await getWorkItemFormService();
const values = await service.getFieldValues([
"System.Id", "System.Title", "System.State", "System.CreatedDate"
]);
console.log("onLoaded", JSON.stringify(values));
},
// Called when the active work item is being unloaded in the UI
onUnloaded: (args) => {
console.log("onUnloaded", JSON.stringify(args));
},
// Called after the work item has been saved
onSaved: (args) => {
console.log("onSaved", JSON.stringify(args));
},
// Called when the work item is reset to its unmodified state (undo)
onReset: (args) => {
console.log("onReset", JSON.stringify(args));
},
// Called when the work item has been refreshed from the server
onRefreshed: (args) => {
console.log("onRefreshed", JSON.stringify(args));
}
};
});
});
事件
| 事件 | 事件说明 | 参数 | 自变量说明 |
|---|---|---|---|
onFieldChanged |
字段更改后触发。 如果字段更改运行规则更新了其他字段,则所有这些更改都是单个事件的一部分。 | ID | 工作项的编号 |
changedFields |
包含所有已更改字段的引用名称的数组。 | ID | 工作项的编号 |
onLoaded |
在数据加载到工作项窗体中、用户打开工作项或用户导航到会审视图中的另一个工作项时触发。 | ID | 工作项的编号 |
onReset |
在用户撤消对工作项的更改后触发。 | ID | 工作项的编号 |
onRefreshed |
用户手动刷新工作项后触发。 | ID | 工作项的编号 |
onSaved |
保存工作项后触发。 对于对话中的工作项,应把 ms.vss-work-web.work-item-notifications 类型设为目标,以确保事件触发,因为一旦对话框关闭,此贡献类型就会被卸载。 有关详细信息,请参阅侦听事件。 |
ID | 工作项的编号 |
onUnloaded |
在用户关闭对话框之前触发,或者在用户移动到会审视图中的另一个工作项之前触发。 | ID | 工作项的编号 |
添加页面
工作项表单上会显示一个新的选项卡。 新页面显示在“ 详细信息 ”选项卡旁边。
若要向工作项窗体添加页面,请在扩展清单中添加一个类型为 ms.vss-work-web.work-item-form-page 并以 ms.vss-work-web.work-item-form 为目标的贡献。
"contributions": [
{
"id": "sample-work-item-form-page",
"type": "ms.vss-work-web.work-item-form-page",
"description": "Custom work item form page",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"name": "My Page",
"uri": "workItemPage.html"
}
}
]
属性
| 财产 | 说明 |
|---|---|
name |
显示在选项卡页上的文本。 |
uri |
IFrame 中加载的 HTML 页面的 URI。 |
JavaScript 示例
请参阅窗体组部分中的 JavaScript 示例。 已注册对象的名称应与贡献的名称匹配 id 。
事件
| 事件 | 事件说明 | 参数 | 自变量说明 |
|---|---|---|---|
onFieldChanged |
字段更改后触发。 如果字段更改运行规则更新了其他字段,则所有这些更改都是单个事件的一部分。 | ID | 工作项的编号 |
changedFields |
包含所有已更改字段的引用名称的数组。 | ID | 工作项的编号 |
onLoaded |
在数据加载到工作项窗体中、用户打开工作项或用户导航到会审视图中的另一个工作项时触发。 | ID | 工作项的编号 |
onReset |
在用户撤消对工作项的更改后触发。 | ID | 工作项的编号 |
onRefreshed |
用户手动刷新工作项后触发。 | ID | 工作项的编号 |
onSaved |
保存工作项后触发。 对于对话中的工作项,应把 ms.vss-work-web.work-item-notifications 类型设为目标,以确保事件触发,因为一旦对话框关闭,此贡献类型就会被卸载。 有关详细信息,请参阅侦听事件。 |
ID | 工作项的编号 |
onUnloaded |
在用户关闭对话框之前触发,或者在用户移动到会审视图中的另一个工作项之前触发。 | ID | 工作项的编号 |
配置贡献
在 Azure DevOps Services 中,组扩展默认显示在第二列末尾,页面贡献显示为最后一个选项卡。默认情况下不显示控件贡献 - 用户必须手动将其添加到窗体。 在 Azure DevOps Server 中,请参阅 “配置工作项”窗体扩展 ,以显示、隐藏或移动贡献。
添加菜单操作
若要将项添加到工作项工具栏,请将此贡献添加到扩展清单。 该项显示在垂直省略号 (...) 下拉菜单中。
"contributions": [
{
"id": "sample-work-item-menu",
"type": "ms.vss-web.action",
"description": "Sample toolbar item which updates the title of a work item",
"targets": [
"ms.vss-work-web.work-item-context-menu"
],
"properties": {
"text": "Try me!",
"title": "Updates the title of the work item from the extension",
"toolbarText": "Try me!",
"icon": "images/show-properties.png",
"uri": "menu-workItemToolbarButton.html"
}
}
]
属性
| 财产 | 说明 |
|---|---|
text |
显示在工具栏项上的文本。 |
title |
显示在菜单项上的工具提示文本。 |
toolbarText |
鼠标悬停于项目上时显示的文本。 |
uri |
用于注册工具栏操作处理程序的页面的 URI。 |
icon |
显示在菜单项上的图标的 URL。 使用 baseUri 解析相对 URL。 |
group |
菜单项的显示位置由它与其他项的关系决定。 具有相同组名称的工具栏项将被分组,并通过分隔符与其他项分开。 |
registeredObjectId |
(可选)已注册菜单操作处理程序的名称。 默认为贡献 ID。 |
侦听事件
观察者在没有任何用户界面的表单上侦听工作项事件。 使用观察者侦听onSaved事件,因为观察者位于表单之外,而表单对话框关闭时不被销毁。
"contributions": [
{
"id": "sample-work-item-form-observer",
"type": "ms.vss-work-web.work-item-notifications",
"description": "Gets events about the current work item form for the 'Try Me!' toolbar button",
"targets": [
"ms.vss-work-web.work-item-form"
],
"properties": {
"uri": "myformobserver.html"
}
}
]
属性
| 财产 | 说明 |
|---|---|
uri |
用于托管监听事件脚本的页面的 URI。 |
事件
| 事件 | 事件说明 | 参数 | 自变量说明 |
|---|---|---|---|
onFieldChanged |
字段更改后触发。 如果字段更改运行规则更新了其他字段,则所有这些更改都是单个事件的一部分。 | ID | 工作项的编号 |
changedFields |
包含所有已更改字段的引用名称的数组。 | ID | 工作项的编号 |
onLoaded |
在数据加载到工作项窗体中、用户打开工作项或用户导航到会审视图中的另一个工作项时触发。 | ID | 工作项的编号 |
onReset |
在用户撤消对工作项的更改后触发。 | ID | 工作项的编号 |
onRefreshed |
用户手动刷新工作项后触发。 | ID | 工作项的编号 |
onSaved |
保存工作项后触发。 对于对话中的工作项,应把 ms.vss-work-web.work-item-notifications 类型设为目标,以确保事件触发,因为一旦对话框关闭,此贡献类型就会被卸载。 有关详细信息,请参阅侦听事件。 |
ID | 工作项的编号 |
onUnloaded |
在用户关闭对话框之前触发,或者在用户移动到会审视图中的另一个工作项之前触发。 | ID | 工作项的编号 |
JavaScript 示例
以下示例通过使用现代 SDK 注册观察者:
import * as SDK from "azure-devops-extension-sdk";
SDK.init();
SDK.ready().then(() => {
SDK.register(SDK.getContributionId(), () => {
return {
onFieldChanged: (args) => {
// Handle field changes
},
onLoaded: (args) => {
// Handle work item loaded
},
onUnloaded: (args) => {
// Handle work item unloaded
},
onSaved: (args) => {
// Handle work item saved
},
onReset: (args) => {
// Handle work item reset (undo)
},
onRefreshed: (args) => {
// Handle work item refreshed
}
};
});
});
兼容性说明
操作与操作提供者
在通过菜单处理程序使用getMenuItems动态加载菜单项时,应用ms.vss-web.action-provider。 当菜单项是静态的,并在清单中定义时使用 ms.vss-web.action 。
弃用的模式
不再支持以下模式:
-
require("VSS/Events/Document")- 新版板中心不支持 -
SDK.js脚本标签和usePlatformScripts: true——请使用 npm 包azure-devops-extension-sdk来替代。