アダプティブ カードの先行入力検索
アダプティブ カードの Typeahead 検索機能を使用すると、 Input.ChoiceSet
コンポーネントの検索機能が強化されます。 検索フィールドにテキストを入力するための選択肢の一覧を提供します。 アダプティブ カードを使用してタイプアヘッド検索を組み込んで、データを検索および選択できます。
次の検索では、typeahead 検索を使用できます。
静的な型検索
静的型検索を使用すると、ユーザーはアダプティブ カード ペイロードの Input.ChoiceSet
内で指定された値から検索できます。 静的な型検索を使用して、ユーザーに複数の選択肢を表示できます。 静的検索のペイロード サイズは、ペイロードで指定された選択肢の数に合わせて増加します。
ユーザーがテキストの入力を開始すると、選択肢がフィルター処理され、入力と部分的に一致します。 ドロップダウン リストでは、検索に一致する入力文字が強調表示されます。
次の図は、静的な型検索を示しています。
動的な型検索
動的な型指定検索は、大規模なデータ セットからデータを検索して選択する場合に便利です。 データ セットは、カード ペイロードで指定されたデータセットから動的に読み込まれます。 typeahead 機能は、ユーザーが入力した選択肢を除外するのに役立ちます。
注:
クエリベースのメッセージ拡張機能など、動的検索では豊富なカード エクスペリエンスを得ることはできません。
typeahead 検索を実装する
Input.ChoiceSet
は、アダプティブ カードの重要な入力コンポーネントの 1 つです。 typeahead 検索コントロールを Input.ChoiceSet
コンポーネントに追加して、typeahead 検索を実装できます。 次の項目を使用して、必要な情報を検索して選択できます。
- 展開された選択などのドロップダウン。
- 1 つの選択など、ラジオ ボタン。
- 複数の選択など、チェック ボックス。
注:
-
Input.ChoiceSet
コントロールは、スタイルとisMultiSelect
プロパティに基づいています。 - グループ チャットで動的な typeahead 検索を使用するには、アプリ マニフェストのボット インストール スコープに
groupchat
スコープを追加し、その特定のグループ チャットにインストールする必要があります。 - ドロップダウンのオプションの数は 15 に制限されています。
スキーマプロパティ
次のプロパティは、typeahead 検索を有効にするために、 Input.ChoiceSet
スキーマに新しく追加されたプロパティです。
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
style | Compact Expanded Filtered |
いいえ | 静的 typeahead でサポートされている検証の一覧にフィルター処理されたスタイルを追加します。 |
choices.data | Data.Query | いいえ | バックエンドから選択項目のリモート セットをフェッチすることで、ユーザーの種類として動的な typeahead を有効にします。 |
値 | String | いいえ | 選択する必要がある最初の選択肢 (または選択肢のセット)。 複数選択の場合は、コンマ区切りの値の文字列を指定します。 |
Data.Query 定義
プロパティ | 型 | 必須 | 説明 |
---|---|---|---|
type | Data.Query | はい | Data.Query オブジェクトであることを指定します。 |
データセット | String | はい | 動的にフェッチされるデータの種類を指定します。 |
値 | String | いいえ | ボットへの呼び出し要求に対して、ユーザーが ChoiceSet に指定した入力を設定します。 |
count | 番号 | いいえ | 呼び出し要求をボットに設定して、返す必要がある要素の数を指定します。 ユーザーが別の金額を送信する場合、ボットはそれを無視します。 |
skip | 番号 | いいえ | 呼び出し要求をボットに設定して、ユーザーがページ分割してリスト内で先に移動することを示します。 |
例
単一および複数の選択オプションを使用した静的および動的な型検索を含むペイロードの例を次に示します。
{
"type": "AdaptiveCard",
"body": [
{
"columns": [
{
"width": "1",
"items": [
{
"size": null,
"url": "https://urlp.asm.skype.com/v1/url/content?url=https%3a%2f%2fi.imgur.com%2fhdOYxT8.png",
"height": "auto",
"type": "Image"
}
],
"type": "Column"
},
{
"width": "2",
"items": [
{
"size": "extraLarge",
"text": "Game Purchase",
"weight": "bolder",
"wrap": true,
"type": "TextBlock"
}
],
"type": "Column"
}
],
"type": "ColumnSet"
},
{
"text": "Please fill out the below form to send a game purchase request.",
"wrap": true,
"type": "TextBlock"
},
{
"columns": [
{
"width": "auto",
"items": [
{
"text": "Game: ",
"wrap": true,
"height": "stretch",
"type": "TextBlock"
}
],
"type": "Column"
}
],
"type": "ColumnSet"
},
{
"columns": [
{
"width": "stretch",
"items": [
{
"choices": [
{
"title": "Call of Duty",
"value": "call_of_duty"
},
{
"title": "Death's Door",
"value": "deaths_door"
},
{
"title": "Grand Theft Auto V",
"value": "grand_theft"
},
{
"title": "Minecraft",
"value": "minecraft"
}
],
"style": "filtered",
"placeholder": "Search for a game",
"id": "choiceGameSingle",
"type": "Input.ChoiceSet"
}
],
"type": "Column"
}
],
"type": "ColumnSet"
},
{
"columns": [
{
"width": "auto",
"items": [
{
"text": "Multi-Game: ",
"wrap": true,
"height": "stretch",
"type": "TextBlock"
}
],
"type": "Column"
}
],
"type": "ColumnSet"
},
{
"columns": [
{
"width": "stretch",
"items": [
{
"choices": [
{
"title": "Static Option 1",
"value": "static_option_1"
},
{
"title": "Static Option 2",
"value": "static_option_2"
},
{
"title": "Static Option 3",
"value": "static_option_3"
}
],
"value": "Static_option_2",
"isMultiSelect": true,
"style": "filtered",
"choices.data": {
"type": "Data.Query",
"dataset": "xbox"
},
"id": "choiceGameMulti",
"type": "Input.ChoiceSet"
}
],
"type": "Column"
}
],
"type": "ColumnSet"
},
{
"columns": [
{
"width": "auto",
"items": [
{
"text": "Needed by: ",
"wrap": true,
"height": "stretch",
"type": "TextBlock"
}
],
"type": "Column"
},
{
"width": "stretch",
"items": [
{
"id": "choiceDate",
"type": "Input.Date"
}
],
"type": "Column"
}
],
"type": "ColumnSet"
},
{
"text": "Buy and download digital games and content directly from your Xbox console, Windows 10 PC, or at Xbox.com.",
"wrap": true,
"type": "TextBlock"
},
{
"text": "Earn points for what you already do on Xbox, then redeem your points on real rewards. Play more, get rewarded. Start earning today.",
"wrap": true,
"type": "TextBlock"
}
],
"actions": [
{
"data": {
"msteams": {
"type": "invoke",
"value": {
"type": "task/submit"
}
}
},
"title": "Request Purchase",
"type": "Action.Submit"
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.2"
}
呼び出し要求と応答のコード スニペット
呼び出し要求
{
"name": "application/search",
"type": "invoke",
"value": {
"queryText": "fluentui",
"queryOptions": {
"skip": 0,
"top": 15
},
"dataset": "npm"
},
"locale": "en-US",
"localTimezone": "America/Los_Angeles",
// …. other fields
}
応答
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken)
{
if (turnContext.Activity.Name == "application/search")
{
var packages = new[] {
new { title = "A very extensive set of extension methods", value = "FluentAssertions" },
new { title = "Fluent UI Library", value = "FluentUI" }};
var searchResponseData = new
{
type = "application/vnd.microsoft.search.searchResponse",
value = new
{
results = packages
}
};
var jsonString = JsonConvert.SerializeObject(searchResponseData);
JObject jsonData = JObject.Parse(jsonString);
return new InvokeResponse()
{
Status = 200,
Body = jsonData
};
}
return null;
}
コード サンプル
サンプルの名前 | 説明 | .NET | Node.js | マニフェスト |
---|---|---|---|---|
アダプティブ カードの Typeahead 検索コントロール | このサンプルでは、アダプティブ カードで静的および動的な typeahead 検索コントロールを使用する方法を示します。 | 表示 | 表示 | 表示 |
関連項目
Platform Docs