扩展“工作项”窗体

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

本文介绍如何使用扩展来自定义工作项窗体向用户呈现的方式。 可以扩展工作项跟踪,包括向 Azure DevOps 中的工作项表单添加一个动作、观察者、组或页面。

有关完整的源代码,请参阅 GitHub 上的 Azure DevOps 扩展示例中UI 示例。

添加组

显示工作项窗体中工具栏项的屏幕截图。

若要向主页添加组,请向扩展清单添加贡献。 此贡献的类型应为 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 指向托管工作项窗体及其脚本上显示的 html 的页面的 URI。
height (可选)定义组的高度。 省略时,其值为 100%。

JavaScript 示例

此示例显示如何注册一个对象,当工作项窗体上发生可能影响你贡献的组的事件时,该对象会被调用。

import { IWorkItemFormService, WorkItemTrackingServiceIds } from "azure-devops-extension-api/WorkItemTracking";
import * as SDK from "azure-devops-extension-sdk";

// Get the WorkItemFormService.  This service allows you to get/set fields/links on the 'active' work item (the work item
// that currently is displayed in the UI).
async function getWorkItemFormService()
{
    const workItemFormService = await SDK.getService<IWorkItemFormService>(WorkItemTrackingServiceIds.WorkItemFormService);
    return workItemFormService;
}

// Register a listener for the work item group contribution after initializing the SDK.
SDK.register(SDK.getContributionId(), function () {
    return {
        // Called when the active work item is modified
        onFieldChanged: function(args) {
            $(".events").append($("<div/>").text("onFieldChanged - " + JSON.stringify(args)));
        },
        
        // Called when a new work item is being loaded in the UI
        onLoaded: function (args) {

            getWorkItemFormService().then(function(service) {            
                // Get the current values for a few of the common fields
                service.getFieldValues(["System.Id", "System.Title", "System.State", "System.CreatedDate"]).then(
                    function (value) {
                        $(".events").append($("<div/>").text("onLoaded - " + JSON.stringify(value)));
                    });
            });
        },
        
        // Called when the active work item is being unloaded in the UI
        onUnloaded: function (args) {
            $(".events").empty();
            $(".events").append($("<div/>").text("onUnloaded - " + JSON.stringify(args)));
        },
        
        // Called after the work item has been saved
        onSaved: function (args) {
            $(".events").append($("<div/>").text("onSaved - " + JSON.stringify(args)));
        },
        
        // Called when the work item is reset to its unmodified state (undo)
        onReset: function (args) {
            $(".events").append($("<div/>").text("onReset - " + JSON.stringify(args)));
        },
        
        // Called when the work item has been refreshed from the server
        onRefreshed: function (args) {
            $(".events").append($("<div/>").text("onRefreshed - " + JSON.stringify(args)));
        }
    }
});

事件

事件 事件说明 参数 自变量说明
onFieldChanged 字段更改后触发。 如果字段更改运行规则更新了其他字段,则所有这些更改都是单个事件的一部分。 ID 工作项的编号
changedFields 包含所有已更改字段的引用名称的数组。 ID 工作项的 ID
onLoaded 在数据加载到工作项窗体中、用户打开工作项或用户导航到会审视图中的另一个工作项时触发。 ID 工作项的 ID
onReset 在用户撤消对工作项的更改后触发。 ID 工作项的 ID
onRefreshed 用户手动刷新工作项后触发。 ID 工作项的 ID
onSaved 保存工作项后触发。 对于对话中的工作项,应把 ms.vss-work-web.work-item-notifications 类型设为目标,以确保事件触发,因为一旦对话框关闭,此贡献类型就会被卸载。 有关详细信息,请参阅侦听事件 身份证 工作项的 ID
onUnloaded 在用户关闭对话框之前触发,或者在用户移动到会审视图中的另一个工作项之前触发。 ID 工作项的 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"
        } 
    }
]

属性

财产 说明
名字 显示在选项卡页上的文本。
uri 指向托管工作项窗体及其脚本上显示的 html 的页面的 URI。

JavaScript 示例

请参阅窗体组部分中的 JavaScript 示例。 已注册对象的名称应与贡献的名称匹配 id

事件

事件 事件说明 论点 自变量说明
onFieldChanged 字段更改后触发。 如果字段更改运行规则更新了其他字段,则所有这些更改都是单个事件的一部分。 ID 工作项的 ID
changedFields 包含所有已更改字段的引用名称的数组。 ID 工作项的编号
onLoaded 在数据加载到工作项窗体中、用户打开工作项或用户导航到会审视图中的另一个工作项时触发。 ID 工作项的编号
onReset 在用户撤消对工作项的更改后触发。 身份识别码 (ID) 工作项的 ID
onRefreshed 用户手动刷新工作项后触发。 ID 工作项的编号
onSaved 保存工作项后触发。 对于对话中的工作项,应把 ms.vss-work-web.work-item-notifications 类型设为目标,以确保事件触发,因为一旦对话框关闭,此贡献类型就会被卸载。 有关详细信息,请参阅侦听事件 ID 工作项的编号
onUnloaded 在用户关闭对话框之前触发,或者在用户移动到会审视图中的另一个工作项之前触发。 ID 工作项的 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 工作项的 ID
onReset 在用户撤消对工作项的更改后触发。 身份识别码 工作项的 ID
onRefreshed 用户手动刷新工作项后触发。 身份识别码 工作项的 ID
onSaved 保存工作项后触发。 对于对话中的工作项,应把 ms.vss-work-web.work-item-notifications 类型设为目标,以确保事件触发,因为一旦对话框关闭,此贡献类型就会被卸载。 有关详细信息,请参阅侦听事件 ID 工作项的 ID
onUnloaded 在用户关闭对话框之前触发,或者在用户移动到会审视图中的另一个工作项之前触发。 ID 工作项的 ID

HTML/JavaScript 示例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Work item extension page sample</title>
</head>

<body>
    <script src="sdk/scripts/SDK.js"></script>

    <script>
        SDK.init({
            usePlatformScripts: true
        });
        
        SDK.ready(function () {
             // Register a listener for the work item page contribution.
            SDK.register(SDK.getContributionId(), function () {
                return {
                    // Called when the active work item is modified
                    onFieldChanged: function(args) {
                        
                    },
                    
                    // Called when a new work item is being loaded in the UI
                    onLoaded: function (args) {
            
                    },
                    
                    // Called when the active work item is being unloaded in the UI
                    onUnloaded: function (args) {
            
                    },
                    
                    // Called after the work item has been saved
                    onSaved: function (args) {
            
                    },
                    
                    // Called when the work item is reset to its unmodified state (undo)
                    onReset: function (args) {
            
                    },
                    
                    // Called when the work item has been refreshed from the server
                    onRefreshed: function (args) {
            
                    }
                }
            });    
        });
     </script>
</body>
</html>    

New Boards Hub 的更改

注意

默认情况下启用了“全新面板中心”功能。 我们强烈建议您使用新的看板中心测试您的内部扩展,以确保兼容性。

使用最新的 SDK

确保扩展使用的是最新版本的 azure-devops-extension-sdk

使用新 SDK 时,还应使用适用于 REST API 的 azure-devops-extension-api 包。 我们每次冲刺更新方法和接口,以确保其中包含所有最新功能。

何时使用操作或操作提供程序

在菜单处理程序上使用 getMenuItems 动态加载菜单项时,请使用 ms.vss-web.action-provider。 避免在菜单项已静态化并在清单中定义时使用 ms.vss-web.action-provider。 应该改用 ms.vss-web.action

软件包require("VSS/Events/Document")不再受支持

全新面板中心不再支持 require("VSS/Events/Document") 导入。