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 拡張機能のサンプル (レガシ コレクションとコントリビューション ガイド) - UI ターゲットを検査したり、ソースを表示したりするためにインストールします。 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 Extension SDK 開発者ポータルを参照してください。
グループを追加する
メインページにグループを追加するには、ms.vss-work-web.work-item-formをターゲットとしたms.vss-work-web.work-item-form-groupの種類を持つ拡張機能マニフェストに貢献を追加します。
"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 |
フィールドが変更された後に発生します。 フィールド変更で他のフィールドを更新するルールが実行された場合、これらの変更はすべて 1 つのイベントに含まれます。 | ID | 作業項目の ID |
changedFields |
変更されたすべてのフィールドの参照名を持つ配列。 | ID | 作業項目の ID |
onLoaded |
作業項目フォームにデータが読み込まれた後、ユーザーが作業項目を開いたとき、またはユーザーがトリアージ ビューで別の作業項目に移動したときに発生します。 | ID | 作業項目の ID |
onReset |
ユーザーが作業項目への変更を元に戻した後に発生します。 | ID | 作業項目の ID |
onRefreshed |
ユーザーが作業項目を手動で更新した後に発生します。 | ID | 作業項目の ID |
onSaved |
作業項目が保存された後に発生します。 ダイアログ内の作業項目の場合は、イベントが確実に発生するようにするため、ms.vss-work-web.work-item-notifications の種類をターゲットにする必要があります。なぜなら、ダイアログが閉じるとこの種類のコントリビューションがアンロードされるからです。 詳細については、「 Listen for events」を参照してください。 |
ID | 作業項目の 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"
}
}
]
プロパティ
| プロパティ | 説明 |
|---|---|
name |
タブ ページに表示されるテキスト。 |
uri |
IFrame に読み込まれた HTML ページへの URI。 |
JavaScript のサンプル
フォーム グループセクションの JavaScript サンプルを参照してください。 登録されているオブジェクトの名前は、コントリビューションの id と一致する必要があります。
イベント
| イベント | イベントの説明 | 引数 | 引数の説明 |
|---|---|---|---|
onFieldChanged |
フィールドが変更された後に発生します。 フィールド変更で他のフィールドを更新するルールが実行された場合、これらの変更はすべて 1 つのイベントに含まれます。 | ID | 作業項目の ID |
changedFields |
変更されたすべてのフィールドの参照名を持つ配列。 | ID | 作業項目の ID |
onLoaded |
作業項目フォームにデータが読み込まれた後、ユーザーが作業項目を開いたとき、またはユーザーがトリアージ ビューで別の作業項目に移動したときに発生します。 | ID | 作業項目の ID |
onReset |
ユーザーが作業項目への変更を元に戻した後に発生します。 | ID | 作業項目の ID |
onRefreshed |
ユーザーが作業項目を手動で更新した後に発生します。 | ID | 作業項目の ID |
onSaved |
作業項目が保存された後に発生します。 ダイアログ内の作業項目の場合は、イベントが確実に発生するようにするため、ms.vss-work-web.work-item-notifications の種類をターゲットにする必要があります。なぜなら、ダイアログが閉じるとこの種類のコントリビューションがアンロードされるからです。 詳細については、「 Listen for events」を参照してください。 |
ID | 作業項目の ID |
onUnloaded |
ユーザーがダイアログを閉じる前、またはユーザーがトリアージ ビューの別の作業項目に移動する前に発生します。 | ID | 作業項目の 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 です。 |
イベントをリッスンする
オブザーバーは、フォーム上の UI なしで作業項目イベントをリッスンします。 オブザーバーを使用して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 | 作業項目の ID |
changedFields |
変更されたすべてのフィールドの参照名を持つ配列。 | ID | 作業項目の ID |
onLoaded |
作業項目フォームにデータが読み込まれた後、ユーザーが作業項目を開いたとき、またはユーザーがトリアージ ビューで別の作業項目に移動したときに発生します。 | ID | 作業項目の ID |
onReset |
ユーザーが作業項目への変更を元に戻した後に発生します。 | ID | 作業項目の ID |
onRefreshed |
ユーザーが作業項目を手動で更新した後に発生します。 | ID | 作業項目の ID |
onSaved |
作業項目が保存された後に発生します。 ダイアログ内の作業項目の場合は、イベントが確実に発生するようにするため、ms.vss-work-web.work-item-notifications の種類をターゲットにする必要があります。なぜなら、ダイアログが閉じるとこの種類のコントリビューションがアンロードされるからです。 詳細については、「 Listen for events」を参照してください。 |
ID | 作業項目の ID |
onUnloaded |
ユーザーがダイアログを閉じる前、またはユーザーがトリアージ ビューの別の作業項目に移動する前に発生します。 | ID | 作業項目の 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
}
};
});
});
互換性に関する注意事項
アクション対アクション プロバイダー
メニュー ハンドラーでms.vss-web.action-providerを使用してメニュー項目を動的に読み込む場合は、getMenuItemsを使用します。 メニュー項目が静的であり、マニフェストで定義されている場合は、 ms.vss-web.action を使用します。
非推奨のパターン
次のパターンはサポートされなくなりました。
-
require("VSS/Events/Document")- 新しい Boards Hub ではサポートされていません -
SDK.jsusePlatformScripts: trueを含むスクリプト タグ - 代わりに npm パッケージazure-devops-extension-sdkを使用します