次の方法で共有


作業項目フォームの拡張

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

拡張機能を使用して、グループ、ページ、メニュー アクション、オブザーバー、またはカスタム コントロールを追加して作業項目フォームをカスタマイズします。

ヒント

新しい Azure DevOps 拡張機能を開始する場合は、まず、保守されているこれらのサンプル コレクションを試してください。現在の製品ビルドで動作し、最新のシナリオ (プル要求ページにタブを追加するなど) について説明します。

サンプルが組織で機能しない場合は、個人用またはテスト組織にインストールし、拡張機能マニフェストのターゲット 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.js usePlatformScripts: trueを含むスクリプト タグ - 代わりに npm パッケージ azure-devops-extension-sdkを使用します