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 |
フィールドが変更された後に発生します。 フィールド変更で他のフィールドを更新するルールが実行された場合、これらの変更はすべて 1 つのイベントに含まれます。 | 身分証明書 | 作業項目の ID |
changedFields |
変更されたすべてのフィールドの参照名を持つ配列。 | 身分証明書 | 作業項目の ID |
onLoaded |
作業項目フォームにデータが読み込まれた後、ユーザーが作業項目を開いたとき、またはユーザーがトリアージ ビューで別の作業項目に移動したときに発生します。 | 身分証明書 | 作業項目の ID |
onReset |
ユーザーが作業項目への変更を元に戻した後に発生します。 | 身分証明書 | 作業項目の ID |
onRefreshed |
ユーザーが作業項目を手動で更新した後に発生します。 | 身分証明書 | 作業項目の ID |
onSaved |
作業項目が保存された後に発生します。 ダイアログ内の作業項目の場合は、イベントが確実に発生するようにするため、ms.vss-work-web.work-item-notifications の種類をターゲットにする必要があります。なぜなら、ダイアログが閉じるとこの種類のコントリビューションがアンロードされるからです。 詳細については、「 Listen for events」を参照してください。 |
身分証明書 | 作業項目の 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"
}
}
]
プロパティ
プロパティ | 説明 |
---|---|
名前 | タブ ページに表示されるテキスト。 |
URI | 作業項目フォームとそのスクリプトに表示される HTML をホストするページへの URI。 |
JavaScript のサンプル
フォーム グループセクションの JavaScript サンプルを参照してください。 登録されているオブジェクトの名前は、コントリビューションの id
と一致する必要があります。
イベント
イベント | イベントの説明 | 引数 | 引数の説明 |
---|---|---|---|
onFieldChanged |
フィールドが変更された後に発生します。 フィールド変更で他のフィールドを更新するルールが実行された場合、これらの変更はすべて 1 つのイベントに含まれます。 | 身分証明書 | 作業項目の ID |
changedFields |
変更されたすべてのフィールドの参照名を持つ配列。 | 身分証明書 | 作業項目の ID |
onLoaded |
作業項目フォームにデータが読み込まれた後、ユーザーが作業項目を開いたとき、またはユーザーがトリアージ ビューで別の作業項目に移動したときに発生します。 | 身分証明書 | 作業項目の ID |
onReset |
ユーザーが作業項目への変更を元に戻した後に発生します。 | 身分証明書 | 作業項目の ID |
onRefreshed |
ユーザーが作業項目を手動で更新した後に発生します。 | 身分証明書 | 作業項目の ID |
onSaved |
作業項目が保存された後に発生します。 ダイアログ内の作業項目の場合は、イベントが確実に発生するようにするため、ms.vss-work-web.work-item-notifications の種類をターゲットにする必要があります。なぜなら、ダイアログが閉じるとこの種類のコントリビューションがアンロードされるからです。 詳細については、「 Listen for events」を参照してください。 |
身分証明書 | 作業項目の ID |
onUnloaded |
ユーザーがダイアログを閉じる前、またはユーザーがトリアージ ビューの別の作業項目に移動する前に発生します。 | 身分証明書 | 作業項目の ID |
作業項目フォームでコントリビューションを構成する
Azure DevOps Services では、既定では、グループ拡張機能はフォームの 2 列目の末尾に表示され、すべての作業項目フォーム ページの後にタブとしてページコントリビューションが表示されます。コントロールの投稿は既定ではフォームに表示されないため、ユーザーは手動でフォームに追加する必要があります。 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。 相対 URL は、 baseUri を使用して解決されます。 |
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 |
フィールドが変更された後に発生します。 フィールド変更で他のフィールドを更新するルールが実行された場合、これらの変更はすべて 1 つのイベントに含まれます。 | 身分証明書 | 作業項目の ID |
changedFields |
変更されたすべてのフィールドの参照名を持つ配列。 | 身分証明書 | 作業項目の ID |
onLoaded |
作業項目フォームにデータが読み込まれた後、ユーザーが作業項目を開いたとき、またはユーザーがトリアージ ビューで別の作業項目に移動したときに発生します。 | 身分証明書 | 作業項目の ID |
onReset |
ユーザーが作業項目への変更を元に戻した後に発生します。 | 身分証明書 | 作業項目の ID |
onRefreshed |
ユーザーが作業項目を手動で更新した後に発生します。 | 身分証明書 | 作業項目の ID |
onSaved |
作業項目が保存された後に発生します。 ダイアログ内の作業項目の場合は、イベントが確実に発生するようにするため、ms.vss-work-web.work-item-notifications の種類をターゲットにする必要があります。なぜなら、ダイアログが閉じるとこの種類のコントリビューションがアンロードされるからです。 詳細については、「 Listen for events」を参照してください。 |
身分証明書 | 作業項目の ID |
onUnloaded |
ユーザーがダイアログを閉じる前、またはユーザーがトリアージ ビューの別の作業項目に移動する前に発生します。 | 身分証明書 | 作業項目の 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>
新しい Boards Hub での変更
メモ
新しい Boards Hub 機能は、既定で有効になっています。 互換性を確保するために、New Boards Hub で内部拡張機能をテストすることを強くお勧めします。
最新の SDK を使用する
拡張機能で最新バージョンの azure-devops-extension-sdk が使用されていることを確認します
新しい SDK を使用する場合は、REST API 用の azure-devops-extension-api パッケージも使用する必要があります。 すべてのスプリントに最新の機能がすべて含まれるように、メソッドとインターフェイスを更新します。
action と action-provider の使い分け
メニュー ハンドラーでms.vss-web.action-provider
を使用してメニュー項目を動的に読み込む場合は、getMenuItems
を使用します。 メニュー項目が静的であり、マニフェストで定義されている場合は、 ms.vss-web.action-provider
を使用しないでください。 代わりに、 ms.vss-web.action
を使用する必要があります。
パッケージ require("VSS/Events/Document")
はサポートされなくなりました
require("VSS/Events/Document")
インポートは、新しい Boards Hub ではサポートされなくなりました。