通过


扩展“工作项”窗体

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022

使用扩展通过添加组、页面、菜单操作、观察器或自定义控件来实现工作项窗体的自定义。

小窍门

如果要启动新的 Azure DevOps 扩展,请先尝试这些维护的示例集合 -- 它们适用于当前产品版本并涵盖新式方案(例如,在拉取请求页上添加选项卡)。

如果某个示例在组织中不起作用,请将其安装到个人或测试组织中,并将扩展清单的目标 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来替代。