Teams でダッシュボードを構築する
このステップ バイ ステップ ガイドは、ダッシュボード タブの作成、ダッシュボードへの新しいウィジェットの追加、Graph API の実装に役立ちます。 次の出力が表示されます。
前提条件
インストール | を使用する場合 |
---|---|
Visual Studio Code | JavaScript、TypeScript、または SharePoint Framework (SPFx) ビルド環境。 バージョン 1.55 以降を使用してください。 |
Teams Toolkit または TeamsFx CLI | アプリのプロジェクト スキャフォールディングを作成する Microsoft Visual Studio Code 拡張機能。 Teams Toolkit v5 を使用します。 |
Microsoft 365 開発者プログラム | アプリをインストールするための適切なアクセス許可を持つ Teams アカウント。 |
Node.js | バックエンド JavaScript ランタイム環境。 詳細については、「 プロジェクトの種類Node.js バージョン互換性テーブル」を参照してください。 |
Microsoft Teams | Microsoft Teams、チャット、会議、通話のすべてを 1 か所で行うアプリを通じて、作業するすべてのユーザーと共同作業を行うことができます。 |
Microsoft Edge (推奨) または Google Chrome | 開発者ツールを備えたブラウザー。 |
新しいダッシュボードを作成する
Teams Toolkit では、ダッシュボードとスキャフォールディングの作成がサポートされています。
新しいダッシュボードを作成するには:
Visual Studio Code アクティビティ バーの [Teams Toolkit] アイコンを選択します。
[ 新しいアプリの作成] を選択します。
[ タブ] を 選択して、新しいタブ プロジェクトを作成します。
[ ダッシュボード] を選択します。
プログラミング言語として [TypeScript ] を選択します。
[既定のフォルダー] を選択して、プロジェクトのルート フォルダーを既定の場所に格納します。
アプリに適した名前を入力し、[ Enter] を選択します。
Teams タブ アプリは数秒で作成されます。
アプリが作成されると、Teams Toolkit に次のメッセージが表示されます。
サイドバーで [Teams Toolkit] アイコンを選択します。
[ Microsoft 365 にサインインする] を選択します。
[サインイン] を選びます。
F5 を選択して、デバッグ モードでアプリケーションを実行します。
[追加] を選択します。
Teams でタブ アプリ ダッシュボードが正常に作成されました。
Teams では、暗いテーマやハイ コントラストのテーマなど、さまざまなテーマもサポートされています。
次の図は、Teams デスクトップ クライアントでのダーク テーマの使用を示しています。
TeamsFx CLI では、
対話型モードを使用する場合は、コマンド
teamsfx new
実行し、キーボードを使用して Visual Studio Code と同じフローを実行します。非対話型モードを使用する場合は、1 つのコマンドで必要なすべてのパラメーターを入力します。
teamsfx new--interactive false--capabilities "dashboard-tab"--programming-language "TypeScript"--folder "./"--app-name dashboard-cli-001
アプリのソース コードを見る
プロジェクトを作成したら、Visual Studio Code の エクスプローラー でプロジェクト フォルダーとファイルを表示できます。 ダッシュボードの主要な実装は、tabs フォルダーにあります。
フォルダー | コンテンツ |
---|---|
.vscode |
デバッグ用の Visual Studio Code ファイル。 |
appPackage |
Teams アプリケーション マニフェストのテンプレート。 |
env |
環境ファイル。 |
infra |
Azure リソースをプロビジョニングするためのテンプレート。 |
src |
ダッシュボード Teams アプリケーションのソース コード。 |
次のファイルは、ダッシュボード タブのビジネス ロジックを提供します。ビジネス ロジックの要件に合わせてファイルを更新できます。 既定の実装では、開始に役立つ出発点が提供されます。
File | コンテンツ |
---|---|
src/models/chartModel.ts |
グラフ ウィジェットのデータ モデル。 |
src/models/listModel.ts |
リスト ウィジェットのデータ モデル。 |
src/services/chartService.ts |
グラフ ウィジェットのデータ取得実装。 |
src/services/listService.ts |
リスト ウィジェットのデータ取得実装。 |
src/dashboards/SampleDashboard.tsx |
ダッシュボード レイアウトの実装のサンプル。 |
src/styles/ChartWidget.css |
グラフ ウィジェット スタイル ファイル。 |
src/styles/ListWidget.css |
リスト ウィジェット スタイル ファイル。 |
src/widgets/ChartWidget.tsx |
グラフを表示できるウィジェットの実装。 |
src/widgets/ListWidget.tsx |
リストを表示できるウィジェットの実装。 |
src/App.css |
アプリケーション ルートのスタイル。 |
src/App.tsx |
アプリケーション ルート。 |
次のファイルは、プロジェクト関連のファイルです。 一般に、これらのファイルをカスタマイズする必要はありません。
File | コンテンツ |
---|---|
src/index.css |
アプリケーション エントリ ポイントのスタイル。 |
src/index.tsx |
アプリケーション エントリ ポイント。 |
src/internal/addNewScopes.ts |
新しいスコープの実装が追加されます。 |
src/internal/context.ts |
TeamsFx コンテキスト。 |
src/internal/login.ts |
サインインの実装。 |
src/internal/singletonContext.ts |
TeamsUserCredential インスタンス シングルトンの実装。 |
ダッシュボードにウィジェットを追加する
ダッシュボードに新しいウィジェットを追加するには、次の手順に従います。
データ モデルを定義する
Visual Studio Code で、 EXPLORER>src>models に移動します。
sampleModel.ts ファイルを作成します。
sampleModel.ts ファイルに次のコードを追加します。
export interface SampleModel { content: string; }
データ取得サービスを作成する
注:
バックエンド サービスまたは Microsoft Graph API からデータを取得するサービスを実装できます。
Visual Studio Code で、 EXPLORER>src>services に移動します。
sampleService.ts ファイルを作成します。
sampleService.ts ファイルに次のコードを追加します。
import { SampleModel } from "../models/sampleModel"; export const getSampleData = (): SampleModel => { return { content: "Hello world!" }; };
ウィジェット ファイルを作成する
Visual Studio Code で、 EXPLORER>src>widgets に移動します。
SampleWidget.tsx ファイルを作成します。
SampleWidget.tsx ファイルに次のコードを追加します。
import { Button, Text } from "@fluentui/react-components"; import { BaseWidget } from "@microsoft/teamsfx-react"; import { SampleModel } from "../models/sampleModel"; import { getSampleData } from "../services/sampleService"; interface SampleWidgetState { data?: SampleModel; } export class SampleWidget extends BaseWidget<any, SampleWidgetState> { override async getData(): Promise<SampleWidgetState> { return { data: getSampleData() }; } override header(): JSX.Element | undefined { return <Text>Sample Widget</Text>; } override body(): JSX.Element | undefined { return <div>{this.state.data?.content}</div>; } override footer(): JSX.Element | undefined { return <Button>View Details</Button>; } }
ダッシュボードにウィジェットを追加する
ダッシュボードにウィジェットを追加するには、次の手順に従います。
Visual Studio Code で、エクスプローラー>src>dashboards>SampleDashboard.tsx に移動します。
override layout()
メソッドを更新して、ウィジェットをダッシュボードに追加します。override layout(): JSX.Element | undefined { return (<> <ListWidget /> <ChartWidget /> <SampleWidget /> </> ); }
省略可能: 列にウィジェットを追加するには、次のコードを参照してください。
.one-column { display: grid; gap: 20 px; grid-template-rows: 1fr 1fr; }
override layout(): JSX.Element | undefined { return (<> <ListWidget /> <div className="one-column"> <ChartWidget /> <SampleWidget /> </div> </> ); }
ウィジェットを作成するための関連するすべての詳細を追加した後、それぞれのファイルを保存します。
変更されたレイアウトと予定表ウィジェットをダッシュボードで表示できます。
SSO と Graph API 呼び出しを追加する
ダッシュボード タブを作成し、新しいウィジェットをダッシュボードに追加する方法について説明しました。 ダッシュボード タブにシングル サインオン (SSO) と graph API 呼び出しを追加しましょう。
SSO の追加
SSO を追加するには、次の手順に従います。
1. Microsoft Entra アプリ マニフェストを作成します。
Microsoft Entra アプリ マニフェストを作成するには、次の手順に従います。
Visual Studio Code で、[エクスプローラー] に移動 します。
aad.manifest.json ファイルを作成します。
aad.manifest.json ファイルに次のコード を 追加します。
{ "id": "${{AAD_APP_OBJECT_ID}}", "appId": "${{AAD_APP_CLIENT_ID}}", "name": "dashboardDemo", "accessTokenAcceptedVersion": 2, "signInAudience": "AzureADMyOrg", "optionalClaims": { "idToken": [], "accessToken": [ { "name": "idtyp", "source": null, "essential": false, "additionalProperties": [] } ], "saml2Token": [] }, "requiredResourceAccess": [ { "resourceAppId": "Microsoft Graph", "resourceAccess": [ { "id": "User.Read", "type": "Scope" } ] } ], "oauth2Permissions": [ { "adminConsentDescription": "Allows Teams to call the app's web APIs as the current user.", "adminConsentDisplayName": "Teams can access app's web APIs", "id": "${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}", "isEnabled": true, "type": "User", "userConsentDescription": "Enable Teams to call this app's web APIs with the same rights that you have", "userConsentDisplayName": "Teams can access app's web APIs and make requests on your behalf", "value": "access_as_user" } ], "preAuthorizedApplications": [ { "appId": "1fec8e78-bce4-4aaf-ab1b-5451cc387264", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "5e3ce6c0-2b1f-4285-8d4b-75ee78787346", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "d3590ed6-52b3-4102-aeff-aad2292ab01c", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "00000002-0000-0ff1-ce00-000000000000", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "bc59ab01-8403-45c6-8796-ac3ef710b3e3", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "0ec893e0-5785-4de6-99da-4ed124e5296c", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "4765445b-32c6-49b0-83e6-1d93765276ca", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] }, { "appId": "4345a7b9-9a63-4910-a426-35363201d503", "permissionIds": ["${{AAD_APP_ACCESS_AS_USER_PERMISSION_ID}}"] } ], "identifierUris": ["api://${{TAB_DOMAIN}}/${{AAD_APP_CLIENT_ID}}"], "replyUrlsWithType": [ { "url": "${{TAB_ENDPOINT}}/auth-end.html", "type": "Web" }, { "url": "${{TAB_ENDPOINT}}/auth-end.html?clientId=${{AAD_APP_CLIENT_ID}}", "type": "Spa" }, { "url": "${{TAB_ENDPOINT}}/blank-auth-end.html", "type": "Spa" } ] }
2. Teams アプリ マニフェストを更新します。
Teams アプリ マニフェストを更新するには、次の手順に従います。
Visual Studio Code で、 EXPLORER>appPackage>manifest.json に移動します。
manifest.json ファイルの有効な domains プロパティの後に、次のコードを追加します。
"webApplicationInfo": { "id": "${{AAD_APP_CLIENT_ID}}", "resource": "api://${{TAB_DOMAIN}}/${{AAD_APP_CLIENT_ID}}" }
3. Teams Toolkit 構成ファイルを更新します。
teamsapp.yml および teamsapp.local.yml ファイルの Teams Toolkit 構成コードを更新するには、次の手順に従います。
[
provision
] の下にコードを追加します。- uses: aadApp/create with: name: "YOUR_AAD_APP_NAME" generateClientSecret: true signInAudience: "AzureADMyOrg" writeToEnvironmentFile: clientId: AAD_APP_CLIENT_ID clientSecret: SECRET_AAD_APP_CLIENT_SECRET objectId: AAD_APP_OBJECT_ID tenantId: AAD_APP_TENANT_ID authority: AAD_APP_OAUTH_AUTHORITY authorityHost: AAD_APP_OAUTH_AUTHORITY_HOST - uses: aadApp/update with: manifestPath: "./aad.manifest.json" outputFilePath: ./build/aad.manifest.${{TEAMSFX_ENV}}.json
アクション
cli/runNpmCommand
とbuild app
名の下に、次のコードを追加します。env: REACT_APP_CLIENT_ID: ${{AAD_APP_CLIENT_ID}} REACT_APP_START_LOGIN_PAGE_URL: ${{TAB_ENDPOINT}}/auth-start.html
4. ソース コードを更新します。
パブリック フォルダー にauth-start.html ファイルと auth-end.html ファイルを作成します。
auth-start.htmlファイルと auth-end.html ファイルにコード を 追加します。
auth-start.htmlに次のコード を 追加します。
<!--The Teams authentication flow process uses this file to assist with retrieval of the access token.--> <!--If you're not familiar with this process, don't alter or remove this file from your project.--> <html> <head> <title>Sign-in Start Page</title> <meta charset="utf-8" /> </head> <body> <script src="https://res.cdn.office.net/teams-js/2.7.1/js/MicrosoftTeams.min.js" integrity="sha384-4Gy2G+qxzDVdrdemcVqKVQvaSK1Ghg3x6xcsaMLPc/pw7KPtiogHGM97LTWF2PWg" crossorigin="anonymous"></script> <script type="text/javascript" src="https://alcdn.msauth.net/browser/2.21.0/js/msal-browser.min.js" integrity="sha384-s/NxjjAgw1QgpDhOlVjTceLl4axrp5nqpUbCPOEQy1PqbFit9On6uw2XmEF1eq0s" crossorigin="anonymous"> </script> <script type="text/javascript"> microsoftTeams.app.initialize().then(() => { microsoftTeams.app.getContext().then(async (context) => { // Generate random state string and store it, so we can verify it in the callback var currentURL = new URL(window.location); var clientId = currentURL.searchParams.get("clientId"); var scope = currentURL.searchParams.get("scope"); var loginHint = currentURL.searchParams.get("loginHint"); const msalConfig = { auth: { clientId: clientId, authority: `https://login.microsoftonline.com/${context.user.tenant.id}`, navigateToLoginRequestUrl: false }, cache: { cacheLocation: "sessionStorage", }, } const msalInstance = new msal.PublicClientApplication(msalConfig); const scopesArray = scope.split(" "); const scopesRequest = { scopes: scopesArray, redirectUri: window.location.origin + `/auth-end.html?clientId=${clientId}`, loginHint: loginHint }; await msalInstance.loginRedirect(scopesRequest); }); }); </script> </body> </html>
SSO ファイルをプロジェクトに追加し、次に Graph API を呼び出す必要があります。
Graph API 呼び出しの追加
Graph API を追加するには、次の手順に従います。
TeamsFx SDK は、graph API 呼び出しを実装します。
Visual Studio Code で、EXPLORER>src>services>listService.ts に移動します。
listService.tsで次のコードを更新します。
/** * Retrieve sample data * @returns data for list widget */ import {TeamsUserCredentialContext} from "../internal/singletonContext"; import { createMicrosoftGraphClientWithCredential, TeamsUserCredential, } from "@microsoft/teamsfx"; import { ListModel } from "../models/listModel"; import { loginAction } from "../internal/login"; export const getListData = async (): Promise<ListModel[]> => { await loginAction(["User.Read"]); let credential = TeamsUserCredentialContext.getInstance().getCredential(); const graphClient = createMicrosoftGraphClientWithCredential(credential, ["User.Read", ]); const me = await graphClient.api("/me").get(); return [ { id: me.id, title: me.displayName, content: me.mail, }, ]; // { // id: "id1", // title: "Sample title", // content: "Sample description", // }, // { // id: "id2", // title: "Sample title", // content: "Sample description", // }, // { // id: "id3", // title: "Sample title", // content: "Sample description", // }, }
EXPLORER>src>widgets>ListWidget.tsx に移動します。
export default class ListWidget()
を更新して、ユーザー プロファイル ウィジェットを追加します。export default class ListWidget extends BaseWidget<any, IListWidgetState> { async getData(): Promise<IListWidgetState> { return { data: await getListData() };
SSO と Graph API は、サインインしているユーザー プロファイルをリスト ウィジェットに表示します。
課題の完了
このようなものを思いついたのですか?
おめでとうございます!
チュートリアルを完了しました。
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。
Platform Docs