Updates from: 10/01/2022 01:29:45
Service Microsoft Docs article Related commit history on GitHub Change details
platform Designing Apps In Meetings https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/design/designing-apps-in-meetings.md
You can find more comprehensive design guidelines, including elements that you c
## Add a meeting extension
-Users can add a meeting extension before and during meetings. They also can add an app for a specific meeting directly from the Teams store.
+Users can add a meeting extension before and during meetings. They can also add an app for a specific meeting directly from the Teams store.
### Add before a meeting
Remember the following if you allow scrolling:
### Navigation
-For scenarios with navigation layers or heavy content, we recommend allowing users to navigate to a secondary layer. Users must be able to go back to the previous layer.
+For scenarios with navigation layers or heavy content, we recommend allowing users to go to a secondary layer. Users must be able to go back to the previous layer.
:::image type="content" source="../../assets/images/apps-in-meetings/in-meeting-tab-nav.png" alt-text="Example shows in-meeting navigation.":::
The shared meeting stage is all about collaboration and participation. Here are
Apps shared to the meeting stage vary in size based on the state of the meeting and how the user resizes the window. Maintain padding and the responsive layout of navigation and controls just as you would in a browser.
-* **Side panel**: A user can have the side panel open at any time during a meeting to chat, view the roster, or use an app (i.e., in-meeting tab). The stage dynamically rearranges when the panel is open.
+* **Side panel**: A user can have the side panel open at any time during a meeting to chat, view the roster, or use an app (that is, in-meeting tab). The stage dynamically rearranges when the panel is open.
* **Video and audio grid**: The video and audio grid is always visible to show meeting participants. When a user spotlights or pins someone in the meeting, this increases the height or width of the participant grid depending on the orientation. #### Meeting stage (without side panel)
-When the side panel isn't open, the meeting stage is 994x678 pixels by default and can be a minimum 792x382 pixels.
+When the side panel isn't open, the meeting stage is 994x678 pixels, by default and can be a minimum 792x382 pixel.
:::image type="content" source="~/assets/images/apps-in-meetings/meeting-stage-no-side-panel.png" alt-text="Image showing shared meeting stage responsiveness with the side panel closed.":::
Your app should only ask users to focus on a single surface a time, whether it's
#### Do: Use a one-column dialog
-Since the dialogs are at the center of the meeting stage, task completion should be fast and simple to avoid user frustration.
+Since the dialogs are at the center of the meeting stage, task completion should be fast, and simple to avoid user frustration.
:::column-end::: :::column span="":::
Colors that clash with the meeting environment may be distracting and appear les
#### Do: Have a back button
-If you have more than one layer of navigation in an in-meeting tab, users must be able to go back to their previous views.
+If you've more than one layer of navigation in an in-meeting tab, users must be able to go back to their previous views.
:::column-end::: :::column span="":::
platform Enable And Configure Your App For Teams Meetings https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/enable-and-configure-your-app-for-teams-meetings.md
You can also add the Teams display picture and people card of the user to in-mee
Shared meeting stage allows meeting participants to interact with and collaborate on app content in real time. You can share your apps to the collaborative meeting stage in the following ways:
-* [Share entire app to stage](#share-entire-app-to-stage) using the share to stage button in the meeting side panel of Teams client or through [deeplinks](~/concepts/build-and-test/deep-links.md#generate-a-deep-link-to-share-content-to-stage-in-meetings).
+* [Share entire app to stage](#share-entire-app-to-stage) using the share to stage button in Teams client.
* [Share specific parts of the app to stage](#share-specific-parts-of-the-app-to-stage) using APIs in the Teams client SDK. ##### Share entire app to stage
platform Teams Apps In Meetings https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/apps-in-teams-meetings/teams-apps-in-meetings.md
The following illustration gives you an idea of the meeting app extensibility fe
This article provides an overview of meeting app extensibility, API references, enable and configure apps for meetings, and custom Together Mode scenes in Teams.
+> [!Note]
+>
+> Meeting apps (side panel, meeting stage) are supported in Teams desktop client. Where as in Teams web client it is supported only when the developer preview is enabled.
+ * **Extend meeting app**: Enhance your meeting experience by using the meeting extensibility feature. This feature enables you to integrate your apps within meetings. It also includes different stages of a meeting lifecycle, where you can integrate tabs, bots, and message extensions. You can identify various participant roles and user types, get meeting events, and generate in-meeting dialogs. * **Configure apps for meetings**: To customize Teams with apps for meetings, enable your apps for Teams meetings by updating the app manifest and also configure the apps for meeting scenarios. * **Customize with Together Mode scenes**: The new custom Together Mode scenes feature enables users to collaborate in a meeting with their team in one place.
platform Add Authentication https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/authentication/add-authentication.md
With the preliminary settings done, let's focus on the creation of the bot to us
[!code-json[appsettings](~/../botbuilder-samples/samples/csharp_dotnetcore/46.teams-auth/appsettings.json?range=1-5)]
-1. In the Solution Explorer, navigate to the `TeamsAppManifest` folder, open `manifest.json` and set `id` and `botId` to the **bot App ID** you saved at the time of the bot registration.
+1. In the Solution Explorer, go to the `TeamsAppManifest` folder, open `manifest.json` and set `id` and `botId` to the **bot App ID** you saved at the time of the bot registration.
# [JavaScript](#tab/node-js) 1. Clone [node-auth-sample][teams-auth-bot-js].
-1. In a console, navigate to the project: </br></br>
+1. In a console, go to the project: </br></br>
`cd samples/javascript_nodejs/46.teams` 1. Install modules</br></br> `npm install`
Alternatively, while in Visual Studio, you can follow these steps:
1. Select **Create**. 1. If the deployment completes successfully, you should see it reflected in Visual Studio. Moreover, a page is displayed in your default browser saying *Your bot is ready!*. The URL will be similar to this: `https://botteamsauth.azurewebsites.net/`. Save it to a file.
-1. In your browser, navigate to the [**Azure portal**][azure-portal].
+1. In your browser, go to the [**Azure portal**][azure-portal].
1. Check your resource group, the bot should be listed along with the other resources. The following image is an example: :::image type="content" source="../../../assets/images/authentication/auth-bot-app-service-in-group.png" alt-text="This screenshot shows how to check resource group and bot.":::
This releases the user token, and the bot won't be able to act on your behalf un
<!--There are several testing scenarios here. Ideally, we'd have a separate article on the what, why, and when for these, and just reference that from here, along with the set of steps that exercises the bot code.-->
-1. In your browser, navigate to the [**Azure portal**][azure-portal].
+1. In your browser, go to the [**Azure portal**][azure-portal].
1. Find your resource group. 1. Select the resource link. The resource page is displayed. 1. In the resource page, select **Test in Web Chat**. The bot starts and displays the predefined greetings.
and when for these, and just reference that from here, along with the set of ste
## Install and test the bot in Teams 1. In your bot project, ensure that the `TeamsAppManifest` folder contains the `manifest.json` along with an `outline.png` and `color.png` files.
-1. In Solution Explorer, navigate to the `TeamsAppManifest` folder. Edit `manifest.json` by assigning the following values:
+1. In Solution Explorer, go to the `TeamsAppManifest` folder. Edit `manifest.json` by assigning the following values:
1. Ensure that the **bot App ID** you received at the time of the bot registration is assigned to `id` and `botId`. 1. Assign this value: `validDomains: [ "token.botframework.com" ]`. 1. Select and **zip** the `manifest.json`, `outline.png`, and `color.png` files. 1. Open **Microsoft Teams**. 1. In the left panel, at the bottom, select the **Apps icon**. 1. In the right panel, at the bottom, select **Upload a custom app**.
-1. Navigate to the `TeamsAppManifest` folder and upload the zipped manifest.
+1. Go to the `TeamsAppManifest` folder and upload the zipped manifest.
The following wizard is displayed: :::image type="content" source="../../../assets/images/authentication/auth-bot-teams-upload.png" alt-text="This screenshot shows an example of the bot after it is uploaded into Teams.":::
This launches ngrok to listen on the port you specify. In return, it gives you a
1. Copy the forwarding HTTPS address. It should be similar to the following: `https://dea822bf.ngrok.io/`. 1. Append `/api/messages` to obtain `https://dea822bf.ngrok.io/api/messages`. This is the **messages endpoint** for the bot running locally on your machine and reachable over the web in a chat in Teams. 1. One final step to perform is to update the messages endpoint of the deployed bot. In the example, we deployed the bot in Azure. So let's perform these steps:
- 1. In your browser, navigate to the [**Azure portal**][azure-portal].
+ 1. In your browser, go to the [**Azure portal**][azure-portal].
1. Select your **Bot Registration**. 1. In the left panel, select **Settings**. 1. In the right panel, in the **Messaging endpoint** box, enter the ngrok URL, in our example, `https://dea822bf.ngrok.io/api/messages`.
platform Send Proactive Messages https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/send-proactive-messages.md
public class NotifyController : ControllerBase
public async Task<IActionResult> Get() {
- foreach (var conversationReference in _conversationReferences.Values)
+ foreach (var conversationReference in _conversationReferences.Values) // Loop of all conversation references must be updated to get it from backend system.
{
- await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, BotCallback, default(CancellationToken));
+ var newReference = new ConversationReference()
+ {
+ Bot = new ChannelAccount()
+ {
+ Id = conversationReference.Bot.Id
+ },
+ Conversation = new ConversationAccount()
+ {
+ Id = conversationReference.Conversation.Id
+ },
+ ServiceUrl = conversationReference.ServiceUrl,
+ };
+ await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, newReference, BotCallback, default(CancellationToken));
} // Let the caller know proactive messages have been sent
platform Deep Links https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/deep-links.md
While it's recommended to use `shareDeepLink()` to generate a deep link to your
> [!NOTE] > > * Personal tabs have a `personal` scope, while channel and group tabs use `team` or `group` scopes. The two tab types have a slightly different syntax since only the configurable tab has a `channel` property associated with its context object. For more information on tab scopes, See the [manifest](~/resources/schem) reference.
-> * Deep links work properly only if the tab was configured using the v0.4 or later library and because of that has an entity ID. Deep links to tabs without entity IDs still navigate to the tab but cannot provide the sub entity ID to the tab.
+> * Deep links work properly only if the tab was configured using the v0.4 or later library and because of that has an entity ID. Deep links to tabs without entity IDs still go to the tab but cannot provide the sub entity ID to the tab.
Use the following format for a deep link that you can use in a bot, connector, or message extension card:
To use this deep link with your bot, specify this as the URL target in your card
### Generate deep links to channel conversation
-Use this deep link format to navigate to a particular conversation within channel thread:
+Use this deep link format to go to a particular conversation within channel thread:
`https://teams.microsoft.com/l/message/<channelId>/<parentMessageId>?tenantId=<tenantId>&groupId=<groupId>&parentMessageId=<parentMessageId>&teamName=<teamName>&channelName=<channelName>&createdTime=<createdTime>`
else { /* handle case where capability isn't supported */ }
```
-## Generate a deep link to share content to stage in meetings
-
-You can also generate a deep link to [share the app to stage](~/apps-in-teams-meetings/enable-and-configure-your-app-for-teams-meetings.md#share-entire-app-to-stage) and start or join a meeting.
-
-> [!Note]
-> Deep link to share content to stage in meeting is supported in Teams desktop client only.
-
-When a deep link is selected in an app by a user who is part of an ongoing meeting, then the app is shared to the stage and a permission pop-up window appears. Users can grant permissions for the participants, such as co-editing a document or collaborating with an app.
--
-When user isn't in a meeting then user is redirected to the Teams calendar where user needs to join a meeting or an instant meeting (Meet now) can be initiated.
--
-Once the user initiates an instant meeting (Meet now), they can add participants and interact with the app.
--
-To add a deep link to share content on stage, you need to have an app context. The app context allows the Teams client to fetch the app manifest and check if the sharing on stage is possible. The following is an example of an app context.
-
-* `{ "appSharingUrl" : "https://teams.microsoft.com/extensibility-apps/meetingapis/view", "appId": "9ec80a73-1d41-4bcb-8190-4b9eA9e29fbb" , "useMeetNow": false }`
-
-The query parameters for the app context are:
-
-* `appID`: This is the ID that can be obtained from the app manifest.
-* `appSharingUrl`: The URL which needs to be shared on stage should be a valid domain defined in the app manifest. If the URL is not a valid domain, an error dialog will pop-up to provide the user with a description of the error.
-* `useMeetNow`: This includes a boolean parameter that can be either true or false.
- * **True** - When the `UseMeetNow` value is true and if there's no ongoing meeting, a new Meet now meeting will be initiated. When there's an ongoing meeting, this value will be ignored.
-
- * **False** - The default value of `UseMeetNow` is false, which means that when a deep link is shared to stage and there's no ongoing meeting, a calendar pop-up will appear. When there's an ongoing meeting, then sharing can be done directly.
-
-Ensure that all the query parameters are properly URI encoded and the app context has to be encoded twice in the final URL. Following is an example.
-
-```json
-var appContext= JSON.stringify({ "appSharingUrl" : "https://teams.microsoft.com/extensibility-apps/meetingapis/view", "appId": "9cc80a93-1d41-4bcb-8170-4b9ec9e29fbb", "useMeetNow":false })
-var encodedContext = encodeURIComponent(appcontext).replace(/'/g,"%27").replace(/"/g,"%22")
-var encodedAppContext = encodeURIComponent(encodedContext).replace(/'/g,"%27").replace(/"/g,"%22")
-```
-
-A deep link can be launched either from the Teams web or from the Teams desktop client.
-
-* **Teams web** - Use the following format to launch a deep link from the Teams web to share content on stage.
-
- `https://teams.microsoft.com/l/meeting-share?deeplinkId={deeplinkid}&fqdn={fqdn}}&lm=deeplink%22&appContext={encoded app context}`
-
- Example: `https://teams.microsoft.com/l/meeting-share?deeplinkId={sampleid}&fqdn=teams.microsoft.com&lm=deeplink%22&appContext=%257B%2522appSharingUrl%2522%253A%2522https%253A%252F%252Fteams.microsoft.com%252Fextensibility-apps%252Fmeetingapis%252Fview%2522%252C%2522appId%2522%253A%25229cc80a93-1d41-4bcb-8170-4b9ec9e29fbb%2522%252C%2522useMeetNow%2522%253Atrue%257D`
-
- |Deep link|Format|Example|
- ||||
- |To share the app and open Teams calendar, when UseMeeetNow is "false", default.|`https://teams.microsoft.com/l/meeting-share?deeplinkId={deeplinkid}&fqdn={fqdn}}&lm=deeplink%22&appContext={encoded app context}`|`https://teams.microsoft.com/l/meeting-share?deeplinkId={sampleid}&fqdn=teams.microsoft.com&lm=deeplink%22&appContext=%257B%2522appSharingUrl%2522%253A%2522https%253A%252F%252Fteams.microsoft.com%252Fextensibility-apps%252Fmeetingapis%252Fview%2522%252C%2522appId%2522%253A%25229cc80a93-1d41-4bcb-8170-4b9ec9e29fbb%2522%252C%2522useMeetNow%2522%253Atrue%257D`|
- |To share the app and initiate instant meeting, when UseMeeetNow is "true".|`https://teams.microsoft.com/l/meeting-share?deeplinkId={deeplinkid}&fqdn={fqdn}}&lm=deeplink%22&appContext={encoded app context}`|`https://teams.microsoft.com/l/meeting-share?deeplinkId={sampleid}&fqdn=teams.microsoft.com&lm=deeplink%22&appContext=%257B%2522appSharingUrl%2522%253A%2522https%253A%252F%252Fteams.microsoft.com%252Fextensibility-apps%252Fmeetingapis%252Fview%2522%252C%2522appId%2522%253A%25229cc80a93-1d41-4bcb-8170-4b9ec9e29fbb%2522%252C%2522useMeetNow%2522%253Atrue%257D`|
-
-* **Team desktop client** - Use the following format to launch a deep link from the Teams desktop client to share content on stage.
-
- `msteams:/l/meeting-share? deeplinkId={deeplinkid}&fqdn={fqdn}&lm=deeplink%22&appContext={encoded app context}`
-
- Example: `msteams:/l/meeting-share?deeplinkId={sampleid}&fqdn=teams.microsoft.com&lm=deeplink%22&appContext=%257B%2522appSharingUrl%2522%253A%2522https%253A%252F%252Fteams.microsoft.com%252Fextensibility-apps%252Fmeetingapis%252Fview%2522%252C%2522appId%2522%253A%25229cc80a93-1d41-4bcb-8170-4b9ec9e29fbb%2522%252C%2522useMeetNow%2522%253Atrue%257D`
-
- |Deep link|Format|Example|
- ||||
- |To share the app and open Teams calendar, when UseMeeetNow is "false", default.|`msteams:/l/meeting-share? deeplinkId={deeplinkid}&fqdn={fqdn}&lm=deeplink%22&appContext={encoded app context}`|`msteams:/l/meeting-share?deeplinkId={sampleid}&fqdn=teams.microsoft.com&lm=deeplink%22&appContext=%257B%2522appSharingUrl%2522%253A%2522https%253A%252F%252Fteams.microsoft.com%252Fextensibility-apps%252Fmeetingapis%252Fview%2522%252C%2522appId%2522%253A%25229cc80a93-1d41-4bcb-8170-4b9ec9e29fbb%2522%252C%2522useMeetNow%2522%253Atrue%257D`|
- |To share the app and initiate instant meeting, when UseMeeetNow is "true".|`msteams:/l/meeting-share? deeplinkId={deeplinkid}&fqdn={fqdn}&lm=deeplink%22&appContext={encoded app context}`|`msteams:/l/meeting-share?deeplinkId={sampleid}&fqdn=teams.microsoft.com&lm=deeplink%22&appContext=%257B%2522appSharingUrl%2522%253A%2522https%253A%252F%252Fteams.microsoft.com%252Fextensibility-apps%252Fmeetingapis%252Fview%2522%252C%2522appId%2522%253A%25229cc80a93-1d41-4bcb-8170-4b9ec9e29fbb%2522%252C%2522useMeetNow%2522%253Atrue%257D`|
-
-The query parameters are:
-
-* `deepLinkId`: Any identifier used for telemetry correlation.
-* `fqdn`: `fqdn` is an optional parameter, which can be used to switch to an appropriate environment of a meeting to share an app on stage. It supports scenarios where a specific app share happens in a particular environment. The default value of `fqdn` is enterprise URL and possible values are `Teams.live.com` for Teams for Life, `teams.microsoft.com`, or `teams.microsoft.us`.
-
-To share the entire app to stage, in the app manifest, you must configure `meetingStage` and `meetingSidePanel` as frame contexts, see [app manifest](../../resources/schem). Otherwise, meeting attendees may not be able to see the content on stage.
- ## Generate a deep link to a call While use of the typed APIs of TeamsJS is recommended, you can also use a manually created deep link to start a call.
platform Prepare Your O365 Tenant https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/prepare-your-o365-tenant.md
To turn on the custom app uploading or sideloading for your developer tenant:
> [!Note] > It can take up to 24 hours for the **Teams** option to appear. You can [upload your custom app to a Teams environment](/microsoftteams/upload-custom-apps#validate) for testing and validation in that time.
-3. Navigate to **Teams apps** > **Setup Policies** > **Global**.
+3. Go to **Teams apps** > **Setup Policies** > **Global**.
![Turn on sideload view](~/assets/images/prepare-test-tenant/turn-on-sideload.png)
platform Include Saas Offer https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md
For complete instructions and API reference, see the [SaaS Fulfillment APIs docu
* When users are assigned a subscription plan, notify them through a Teams bot or email. In the messaging, include information on how to add the app to Teams and get started. * Support the idea of multiple admins. In other words, multiple users in the same org can purchase and manage their own subscriptions.
+## Manage license for third party apps in Teams
+
+Teams allows independent software vendors (ISVs) admins or users to manage SaaS licenses for third party apps purchased from Teams storefront. ISV admins or users can easily assign, unassign, use, and track SaaS licenses.
+
+To enable license management for an app in Teams, follow the steps:
+
+1. [Create an offer in Partner Center](#create-an-offer-in-partner-center)
+1. [Update your Teams app](#update-your-teams-app)
+1. [Post purchase](#post-purchase)
+1. [Integrate with Graph Usage Right API](#integrate-with-graph-usage-right-api)
+
+### Create an offer in Partner Center
+
+1. Sign in to [Partner Center](https://partner.microsoft.com/) and select **Partner Center**.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/partner-center-home-page.png" alt-text="The screenshots shows how to login to the Partner Center account.":::
+
+1. In the **Home** page, select **Marketplace offers** tab to define commercial marketplace offers.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/home-page.png" alt-text="The screenshots shows the home page and Marketplace offer tab in the Partner Center.":::
+
+1. Select **Overview** from the left pane.
+
+1. Select **New Offer** > **Software as a Service**.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/commercial-marketplace.png" alt-text="The screenshots shows the marketplace offer page where you can select new offer.":::
+
+1. Enter **Offer ID** and **Offer alias** and select **Create**.
+
+ > [!NOTE]
+ > If you're creating an offer for testing purpose, add the text **-ISVPILOT** to the end of your offer alias. This indicates the certification team that the offer is for testing purposes. Microsoft delete offers with **-ISVPILOT** periodically. So, don't use this tag for reasons other than testing the license management capability.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/saas.png" alt-text="The screenshots shows how to enter Offer ID and Offer alias in the Partner Center.":::
+
+1. In Offer setup page, under setup details, select the checkbox **Yes, I would like Microsoft to manage customer licenses on my behalf**.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/saas-isvpilot.png" alt-text="The screenshots shows the offer setup page to setup license to manage for your app within Teams.":::
+
+ > [!NOTE]
+ >
+ > * This is a one-time setting and you can't change it once your offer is published. This allows the customer to manage licenses for your app within Teams.
+ > * The App manifest supports only one offer for an app. Choose an appropriate license management solution for all the plans available in your offer and you can't change this option after the offer is pushed to live.
+
+1. Select **Save draft**.
+
+1. Select **Plan overview** from the left pane, and then select **Create new plan**.
+
+ > [!NOTE]
+ > You need to add at least one plan.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/plan-overview.png" alt-text="The screenshots shows plan overview to create a new plan for your apps in the Partner Center.":::
+
+1. Enter Plan ID and Plan name, and then select **Create**.
+
+1. Enter the **Plan name** and **Plan description**.
+
+ > [!NOTE]
+ > The plan information displays on Teams marketplace and [Appsource](https://appsource.microsoft.com/) under offer listing (plans section).
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/plan-listing.png" alt-text="The screenshots shows plan page to add plan name and plan description for your app.":::
+
+1. Select **Save draft**.
+
+1. Select **Pricing and availability** from the left pane.
+
+1. Add pricing and availability details.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/pricing-availability.png" alt-text="The screenshots shows pricing and availability page to add SaaS offer for your app.":::
+
+1. Select **Save draft**.
+
+1. Select **Plan overview** at the top of the page to go to the listing page that shows all the plans you've created for this offer.
+
+ :::image type="content" source="~/assets/images/first-party-license-mgt/list-of-plans-created.png" alt-text="The screenshots shows plan listing page with service ID, pricing model, availability, status and action.":::
+
+1. Copy the service ID of the plan you created to integrate with Microsoft Graph Usage Rights API.
+
+### Update your Teams app
+
+Update your Teams app to map to the paid functionality and [Map your Teams app](https://aka.ms/TMTG) to your offer and publish.
+
+### Post purchase
+
+1. After activation, customer is redirected from landing page to Teams License Management.
+
+1. Upon successful completion of subscription purchase, the customer is redirected to the app landing page for subscription activation. This is the existing experience for user purchasing [monetized apps in Teams](https://aka.ms/TMTG).
+
+1. After the customer activates the subscription purchase on landing page, customer is redirected to subscriptions page in Teams via a [redirect URL](https://teams.microsoft.com/_#/subscriptionManagement) link or button that the customer selects on the publisher landing page.
+
+### Integrate with Graph Usage Right API
+
+Integrate with Graph Usage Right API to manage user permissions at the time of app launch by a customer who has a purchase license. You're required to determine the userΓÇÖs permissions for the app with a Graph call to the Usage Rights API.
+
+You can call Graph APIs to determine if the currently logged in user with a valid subscription of the plan has access to your app. To call Graph UsageRight API to check user permissions, follow the steps:
+
+1. Get user OBO token: [Get access on behalf of a user - Microsoft Graph | Microsoft Docs](/graph/auth-v2-user).
+
+1. Call Graph to get userΓÇÖs object ID: [Use the Microsoft Graph API - Microsoft Graph | Microsoft Docs](/graph/use-the-api).
+
+1. Call UsageRights API to determine the user has License to the plan [List user usageRights - Microsoft Graph beta | Microsoft Docs](/graph/api/user-list-usagerights?view=graph-rest-beta&tabs=http&preserve-view=true).
+
+ > [!NOTE]
+ > You need to have minimum `User.Read` permissions to call UsageRights.
+ > The UsageRights API is currently in beta version. After the version is updated to V1, ISV users should upgrade from beta to V1 version.
+
+### Check license usage in Partner Center analytics
+
+1. Sign in to [Partner Center](https://partner.microsoft.com/).
+1. In the left pane, go to **Commercial Marketplace > Analyze > Licensing**.
+1. Select **Plan and Tenant** in the reporting widget to see the month wise usage.
+ ## Build a landing page for subscription management When someone finishes buying a subscription plan for your app in the Teams store, the commercial marketplace will direct them to your landing page where they can manage the subscription (such as assign a license to a specific user in their org).
+Select **No, I would prefer to manage customer licenses myself** in such cases.
+ For complete instructions, see [build the landing page for your SaaS offer](/azure/marketplace/azure-ad-transactable-saas-landing-page).
+When someone finishes buying a subscription plan for your app and wants to stay in the Teams, without directing them to your landing page, select **Yes, I would like Microsoft to manage customer licenses on my behalf**.
+
+For more information, see [first party license management](/platform/concepts/deploy-and-publish/appsource/prepare/first-party-license-management).
+ ### Best practices for landing pages Consider the following approaches when building a landing page for the Teams app youΓÇÖre monetizing. See an example landing page in the [end-user purchasing experience](#end-user-purchasing-experience).
platform Monetize Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/monetize-overview.md
ms.localizationpriority: high
# Monetize your app Microsoft Teams app Store provides features that enable you to monetize your apps and gain customers by engaging with your users. The topics in this section show you how to build these features into your app.
-
+ ## Choose a pricing model :::row:::
With a transactable Software as a Service (SaaS) offer, you can test the end-to-
:::column-end::: :::row-end:::
+**Manage license for third party apps in Teams**
+
+Using Microsoft license management, independent software vendors (ISVs) can manage SaaS license purchased in Teams to easily assign, unassign, use, and track SaaS licenses. For more information, see [Manage license for third party apps in Teams](include-saas-offer.md#manage-license-for-third-party-apps-in-teams).
+ ## Next step [Include a SaaS offer with your Microsoft Teams app](~/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md)
platform Dotnet Upload To Teams https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/includes/tabs/dotnet-upload-to-teams.md
In the *Test and distribute* section:
- In the final pop-up window, select a value for the tab page (either a red or gray icon) and select **Save**.
-To view your tab, navigate to the team you installed it on, and select it from the tab bar. The page that you chose during configuration should be displayed.
+To view your tab, go to the team you installed it on, and select it from the tab bar. The page that you chose during configuration should be displayed.
platform Node Js Yeoman Prereq https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/includes/tabs/node-js-yeoman-prereq.md
In addition, this project requires that you have the following installed in your
1. Open a command prompt and create a new directory for your tab project.
-1. To start the generator, navigate to your new directory and type the following command:
+1. To start the generator, go to your new directory and type the following command:
```bash yo teams
platform Extend M365 Teams Message Extension https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-message-extension.md
In Microsoft Teams, a message extension consists of a web service that you host
For users to interact with your message extension from Outlook, you'll need to add an Outlook channel to your bot:
-1. From [Microsoft Azure portal](https://portal.azure.com) (or [Bot Framework portal](https://dev.botframework.com) if you previously registered there), navigate to your bot resource.
+1. From [Microsoft Azure portal](https://portal.azure.com) (or [Bot Framework portal](https://dev.botframework.com) if you previously registered there), go to your bot resource.
1. From *Settings*, select **Channels**.
platform Extend M365 Teams Personal Tab https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-personal-tab.md
To view your app running in Outlook on Windows desktop:
To view your app in Outlook on the web:
-1. Navigate to [Outlook on the web](https://outlook.office.com) and sign in using your dev tenant account.
+1. Go to [Outlook on the web](https://outlook.office.com) and sign in using your dev tenant account.
1. On the side bar, select **More Apps**. Your sideloaded app title appears among your installed apps. 1. Select your app icon to launch and preview your app running in Outlook on the web.
platform Prerequisites https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/prerequisites.md
To install Office 365 Beta Channel applications in your test environment:
1. Sign in to your test environment with your test tenant credentials. 1. Download the [Office Deployment Tool](https://www.microsoft.com/download/details.aspx?id=49117) and extract to a local folder. 1. Go to the local folder and open *configuration-Office365-x86.xml* (or **x64.xml*, depending on your environment) in a text editor and update the *Channel* value to `BetaChannel`.
-1. Open Command Prompt and navigate to the local folder path.
+1. Open Command Prompt and go to the local folder path.
1. Run `setup.exe /configure configuration-Office365-x86.xml` (or use the **x64.xml* file, depending on your setup). 1. Open Outlook (desktop client) and set up the mail account using your test tenant credentials. 1. Open **File** > **Office Account** > **About Outlook** to confirm you're running a Microsoft 365 *Beta Channel* build of Outlook.
- :::image type="content" source="images/outlook-about-beta-channel.png" alt-text="Go to 'About Outlook' from your Office Account to verify you are running a Beta Channel build.":::
+ :::image type="content" source="images/outlook-about-beta-channel.png" alt-text="Go to 'About Outlook' from your Office Account to verify you're running a Beta Channel build.":::
1. Verify that *Microsoft Edge WebView2 Runtime* is installed. Open Windows **Start** > **Apps & features**, and search for **webview**:
To install Office 365 Beta Channel applications in your test environment:
You can preview Teams personal tabs running in Office app for Android by joining the beta program.
-To install the latest Office app beta build to your physical Android device or Android emulator:
+To install the latest Office app beta, build to your physical Android device, or Android emulator:
1. Ensure you use a Google Play [supported Android device](https://support.google.com/googleplay/answer/1727131). 1. Launch the **Play Store** on your Android device,.
platform Create Extensions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/messaging-extension-v3/create-extensions.md
Below is an example of the `value` object containing the message details that wi
You can test your message extension by uploading your app. For more information, see [Uploading your app in a team](~/concepts/deploy-and-publish/apps-upload.md).
-To open your message extension, navigate to any of your chats or channels. Choose the **More options** (**&#8943;**) button in the compose box, and choose your message extension.
+To open your message extension, go to any of your chats or channels. Choose the **More options** (**&#8943;**) button in the compose box, and choose your message extension.
## Collecting input from users
platform Search Extensions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/messaging-extension-v3/search-extensions.md
For search based message extension set the `type` parameter to `query`. Below is
You can test your message extension by uploading your app.
-To open your message extension, navigate to any of your chats or channels. Choose the **More options** (**&#8943;**) button in the compose box, and choose your message extension.
+To open your message extension, go to any of your chats or channels. Choose the **More options** (**&#8943;**) button in the compose box, and choose your message extension.
## Add event handlers
platform Moodleinstructions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/moodleInstructions.md
Ensure to install and download the following before proceeding with the Microsof
1. After the detection of new plugins to be installed, Moodle should redirect you to the install new plugins page. If this doesn't happen, in the **Site administration** page, select **Notifications** in the **General** tab, this should trigger the installation of the plugins.
-1. After the plugins are install, go to the **Plugins** tab in the **Site administrator** page, select **Authentication** section link, and enable **OpenID Connect**. It is OK to leave the plugin configuration blank - they will be filled in later.
+1. After the plugins are install, go to the **Plugins** tab in the **Site administrator** page, select **Authentication** section link, and enable **OpenID Connect**. It's OK to leave the plugin configuration blank - they'll be filled in later.
1. In the **Site administrator** page, scroll down to the **Local plugins** section and select the **Microsoft 365 Integration** link.
Use the generated `AppID` and `Key` in your Microsoft 365 Moodle Plugins setup p
1. Right-click on **Windows PowerShell**. 1. Select **Run as Administrator**.
-1. Navigate to the unzipped directory by typing `cd .../.../Moodle-AzureAD-Powershell` where `.../...` is the path to the directory.
+1. Go to the unzipped directory by typing `cd .../.../Moodle-AzureAD-Powershell` where `.../...` is the path to the directory.
1. Execute the PowerShell script:
Use the generated `AppID` and `Key` in your Microsoft 365 Moodle Plugins setup p
Γ£ö Update all accounts in Moodle for users in Azure AD.
- 1. In the **User Creation Restriction** section, you can setup a filter to limit the Azure AD users that is synced to Moodle.
+ 1. In the **User Creation Restriction** section, you can set up a filter to limit the Azure AD users that is synced to Moodle.
1. To validate [cron](https://docs.moodle.org/400/en/Cron) jobs and run them manually for the first run, select the **Scheduled tasks management page** link in the **Sync users with Azure AD** section. This takes you to the **Scheduled Tasks** page.
To deploy your app:
> [!NOTE] > If you are logged in as a global administrator, you must have the option of uploading the app to your organization's app catalog, otherwise you can only load the app for a team in which you are a member.
-4. Select the `manifest.zip` package you downloaded previously and select **Save**. If you have not downloaded the app manifest package, you can download from the **Team Settings** tab of the plugins configuration page in Moodle.
+4. Select the `manifest.zip` package you downloaded previously and select **Save**. If you haven't downloaded the app manifest package, you can download from the **Team Settings** tab of the plugins configuration page in Moodle.
-Now that you have the app installed, you can add the tab to any channel that you have access to. To do so, navigate to the channel, select the **plus** (Γ₧ò) symbol and select your app from the list. Follow the prompts to finish adding your Moodle course tab to a channel.
+Now that you have the app installed, you can add the tab to any channel that you have access to. To do so, go to the channel, select the **plus** (Γ₧ò) symbol and select your app from the list. Follow the prompts to finish adding your Moodle course tab to a channel.
## 5. Allow automatic creation of Moodle tabs in Microsoft Teams
To allow automatic creation of Moodle tabs:
1. If the Azure app has the recommendated permission, for the **Moodle app ID** setting, it should show an **Automatically detected value**, copy this value to the setting.
-1. If the automatically detected value does not present, follow the instruction on the page to find the Moodle app ID and fill in the setting.
+1. If the automatically detected value doesn't present, follow the instruction on the page to find the Moodle app ID and fill in the setting.
-When a Moodle course is synced, Teams automatically installs the Moodle app in the team, creates a Moodle tab in the General channel of Teams, and configures it to contain the course page for the Moodle course from which it is synced. You can now start working with your Moodle courses directly from Teams.
+When a Moodle course is synced, Teams automatically installs the Moodle app in the team, creates a Moodle tab in the General channel of Teams, and configures it to contain the course page for the Moodle course from which it's synced. You can now start working with your Moodle courses directly from Teams.
> [!NOTE] > To share any feature requests or feedback with us, visit our [User Voice page](https://support.microsoft.com/en-us/office/uservoice-pages-430e1a78-e016-472a-a10f-dc2a3df3450a).
platform Manifest Schema Dev Preview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema-dev-preview.md
Specifies the native features on a user's device that your app may request acces
**Optional**, except **Required** where noted
-A list of valid domains from which the app expects to load any content. Domain listings can include wildcards, for example `*.example.com`. This matches exactly one segment of the domain; if you need to match `a.b.example.com` then use `*.*.example.com`. If your tab configuration or content UI needs to navigate to any other domain besides the one use for tab configuration, that domain must be specified here.
+A list of valid domains from which the app expects to load any content. Domain listings can include wildcards, for example `*.example.com`. This matches exactly one segment of the domain; if you need to match `a.b.example.com` then use `*.*.example.com`. If your tab configuration or content UI needs to go to any other domain besides the one use for tab configuration, that domain must be specified here.
It is **not** necessary to include the domains of identity providers you want to support in your app, however. For example, to authenticate using a Google ID, it's necessary to redirect to accounts.google.com, but you shouldn't include accounts.google.com in `validDomains[]`.
platform Team Chat Member Api Changes https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/team-chat-member-api-changes.md
Following are the upcoming API changes:
> `objectId` is changed to `aadObjectId` to match what is called in the `Activity` object of a Bot Framework message. The new API is available with version 4.8 or later of the Bot Framework SDK. It is also available in the Teams SDK extension Bot Framework 3.x. Meanwhile, you can use the [REST](/microsoftteams/platform/bots/how-to/get-teams-context?tabs=json#get-single-member-details) endpoint. * `TeamsInfo.GetMembersAsync` in C# and `TeamsInfo.getMembers` in TypeScript or Node.js is formally deprecated. Once the new API is available, you must update your bots to use it. This also applies to the [underlying REST API that these APIs use](/microsoftteams/platform/bots/how-to/get-teams-context?tabs=json#tabpanel_CeZOj-G++Q_json).
-* By late 2022, bots can't proactively retrieve the `userPrincipalName` or `email` properties for members of a chat or team. Bots must use the Graph APIs to retrieve the required information. The new `GetConversationPagedMembers` API can't return the `userPrincipalName` and `email` properties from late 2022. Bots must use Graph API with an access token to retrieve information.
+* By late 2022, bots can't proactively retrieve the `userPrincipalName` or `email` properties for members of a chat or team. Bots must use the Graph APIs to retrieve the required information. The new `GetConversationPagedMembers` API can't return the `userPrincipalName` and `email` properties from late 2022. Bots must use Graph API with an access token to retrieve information.
+
+> [!NOTE]
+>
+> We recommend you to use the [Graph API](/microsoftteams/platform/resources/team-chat-member-api-changes#api-changes) with an access token to retrieve information.
platform Troubleshoot https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/troubleshoot.md
If you aren't seeing your content in the tab view, it could be:
* your content can't be displayed in an `<iframe>`. * the content domain isn't in the [validDomains](~/resources/schem#validdomains) list in the manifest.
+> [!NOTE]
+> A blank tab appears when the given tab URL redirects to login screen. Login pages donΓÇÖt render in iFrames as a safeguard against clickjacking. Your authentication logic must use a method other than redirect.
+ ### The Save button isn't enabled on the settings dialog Be sure to call `microsoftTeams.settings.setValidityState(true)` once the user has input or selected all required data on your settings page to enable the save button.
platform App Templates https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/app-templates.md
The Champion Management Platform (CMP) app template helps you manage, scale, and
The Company Communicator app enables corporate teams to create and send messages intended for multiple teams or large number of employees over chat allowing organization to reach employees right where they collaborate. Utilize this template for multiple scenarios such as new initiative announcements, employee onboarding, modern learning, and development or organization-wide broadcasts.
-The app provides an easy interface for designated users to create, preview, collaborate and send messages.
+The app provides an easy interface for designated users to create, preview, collaborate, and send messages.
It provides a foundation to build custom targeted communication capabilities such as custom telemetry on how many users acknowledged or interacted with a message.
The Get Started app template allows you to bring the power of Microsoft 365 lear
## Microsoft Teams Emergency Operations Center (TEOC)
-The Microsoft Teams Emergency Operations Center (TEOC) solution template leverages the power of the Microsoft 365 platform to centralize incident response, information sharing and field communications using powerful services like Microsoft Lists, SharePoint and more. An open-source solution supported by Microsoft, provides core functionality and can be extended to meet specific agency requirements.
+The Microsoft Teams Emergency Operations Center (TEOC) solution template leverages the power of the Microsoft 365 platform to centralize incident response, information sharing and field communications using powerful services like Microsoft Lists, SharePoint, and more. An open-source solution supported by Microsoft, provides core functionality and can be extended to meet specific agency requirements.
[Get it on GitHub](https://github.com/OfficeDev/microsoft-teams-emergency-operations-center/) ## Tournament of Teams
-Champions are critical in helping drive adoption and developing new tournaments, helping in your business goals. Make sure you are leveraging your Champions to help identify and build new adoption-themed tournaments, and inspire your organization to learn and participate.
+Champions are critical in helping drive adoption and developing new tournaments, helping in your business goals. Ensure that you are leveraging your Champions to help identify and build new adoption-themed tournaments, and inspire your organization to learn and participate.
[Get it on GitHub](https://github.com/OfficeDev/microsoft-teams-apps-tournament-of-teams)
platform App With Collaboration Controls https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/app-with-collaboration-controls.md
You would need to add the Settings IDs that you've saved earlier for your applic
:::image type="content" source="../assets/images/collaboration-control/launch-window.png" alt-text="The screenshot is an example that shows the control window.":::
-1. Select **Configure** and navigate to the General tab to add the Group ID.
+1. Select **Configure** and go to the General tab to add the Group ID.
:::image type="content" source="../assets/images/collaboration-control/groupid-general.png" alt-text="The screenshot describes how to add the Group ID in General tab.":::
To schedule an external meeting with the customer, select the dropdown next to t
Users can see both Internal meetings and Customer Bookings on their meeting list. After the meeting is started, users can join by selecting the **Join** button, which opens the meeting directly in Microsoft Teams.
-As the meetings are backed by Outlook, users can navigate to either Bookings, or Outlook Calendar to see all the meetings listed in a single calendar. Internal meetings are listed in shared calendar.
+As the meetings are backed by Outlook, users can go to either Bookings, or Outlook Calendar to see all the meetings listed in a single calendar. Internal meetings are listed in shared calendar.
Following are the steps to add a shared calendar to your Outlook (optional) :
platform Collaboration Controls Limitations https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/collaboration-controls-limitations.md
# Limitations and known issues > [!NOTE]
-> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+> Currently, Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
Following are the limitations for Collaboration controls: * Components can't be used in Canvas apps. * Components only support full tab views.
- :::image type="content" source="../assets/images/collaboration-control/tasks-tab.png" alt-text="tasks" border="true":::
+ :::image type="content" source="../assets/images/collaboration-control/tasks-tab.png" alt-text="The screenshot shows the tasks." border="true":::
-* The subgrid view selected isn't honored. All tasks, meetings, or notes for the collaborative record will be displayed.
+* The subgrid view selected isn't honored. All tasks, meetings, or notes for the collaborative record are displayed.
- :::image type="content" source="../assets/images/collaboration-control/subgrid-view.png" alt-text="subgrid view" border= "true":::
+ :::image type="content" source="../assets/images/collaboration-control/subgrid-view.png" alt-text="The screenshot shows the subgrid view of the tasks." border= "true":::
-* Activities added to the timeline control donΓÇÖt appear in the components, tasks, meetings and notes created in the components aren't included in the timeline control.
+* Activities added to the timeline control donΓÇÖt appear in the components, tasks, meetings, and notes created in the components aren't included in the timeline control.
* New records must be saved before accessing the components, otherwise you'll see an empty screen. * The components don't inherit theming from the form or app they're added to. * Localization is only available when running the app inside Microsoft Teams.
Following are the limitations for Collaboration controls:
**Admin Center does not update when installation or upgrade is complete**
-When following the installation steps in [install Collaboration controls](~/samples/install-collaboration-control.md), you're redirected to the Power Platform admin center. A banner is displayed when installation starts, but it isn't updated when installation completes. The status is listed during installation and when installation is complete it may disappear from the list. You can view the solutions list at [https://make.powerapps.com/](https://make.preview.powerapps.com/) to confirm that installation is complete.
+When following the installation steps in [install Collaboration controls](~/samples/install-collaboration-control.md), you're redirected to the Power Platform admin center. A banner is displayed when installation starts, but it isn't updated when installation completes. The status is listed during installation and when it's completed it might not be available in the list. You can view the solutions list at [https://make.powerapps.com/](https://make.preview.powerapps.com/) to confirm that installation is complete.
**View during installation:**
- :::image type="content" source="../assets/images/collaboration-control/view-during-installation.png" alt-text="view during installation" border="true":::
+ :::image type="content" source="../assets/images/collaboration-control/view-during-installation.png" alt-text="The screenshot shows the process during installation." border="true":::
**View after installation:**
- :::image type="content" source="../assets/images/collaboration-control/view-after-installation.png" alt-text="view after installation" border="true":::
+ :::image type="content" source="../assets/images/collaboration-control/view-after-installation.png" alt-text="The screenshot shows the completion of the installation." border="true":::
-When upgrading the controls to a later version, the same installation started banner displays, but the control status remains installing even after the upgrade is complete. You can confirm that the upgrade is complete by checking the solutions list at [https://make.powerapps.com/](https://make.preview.powerapps.com/), it should take approximately 15 minutes.
+When upgrading the controls to a later version, the same installation started banner displays, but the control status remains installing even after the upgrade is complete. You can confirm the upgrade is complete by checking the solutions list at [https://make.powerapps.com/](https://make.preview.powerapps.com/), it must take approximately 15 minutes.
You can also see in the history for specific solutions that the later version was installed and then the previous version was removed:
- :::image type="content" source="../assets/images/collaboration-control/history.png" alt-text="History check" border="true":::
+ :::image type="content" source="../assets/images/collaboration-control/history.png" alt-text="The screenshot shows the history for specific solutions of the versions that are installed and removed." border="true":::
## Bookings Meetings
-The Meetings control supports one on one meetings when using Bookings to engage with users outside of your organization. one to many meetings aren't supported at this time using Collaboration controls.
+The Meetings control supports one on one meetings when using Bookings to engage with users outside of your organization. One to many meetings aren't supported at this time using Collaboration controls.
**Meeting attendee status is incorrect**
-When an attendee RSVPs to a meeting, their response status may not display correctly in both the agenda view and the meeting details. Selecting the decline button may also return an error message on screen.
+When an attendee RSVPs to a meeting, their response status might not display correctly in both the agenda view and the meeting details. Selecting the decline button might return an error message on screen.
## Tasks
The text on the ΓÇ£clear" button displayed on the Tasks filter isn't translated.
**Tasks: Grid context menu appears cropped**
-When, the Tasks grid is populated by a low number of Tasks the grid context menu may appear cropped and require use of scrollbars.
+When the Tasks grid is populated by a low number of Tasks the grid context menu may appear cropped and require use of scrollbars.
**Tasks: Keyword search filter use ΓÇ£BeginsWithΓÇ¥ operator for ΓÇ£GuestΓÇ¥ tasks**
When search Tasks using the keyword text filter, ΓÇ£GuestΓÇ¥ tasks are returned
## Files
-When navigating into the Archive folder after archiving files, users may experience duplicate archive folders. Navigating from the archive folder(s) to the files main view will resolve the issue, and files that are archived won't be removed.
+When navigating into the Archive folder after archiving files, users might experience duplicate archive folders. Navigating from the archive folder(s) to the files main view resolves the issue, and files that are archived won't be removed.
## Controls
When navigating into the Archive folder after archiving files, users may experie
If a control fails to save a task or meeting, the likely cause is misconfigured Group ID or Channel ID.
-Solution 1: Confirm the IDs are correct, and the settings have been applied as per the settings exercise.
+Solution 1: Confirm the IDs are correct and the settings are applied as per the settings exercise.
-Solution 2: Try to ensure that the Power Apps environment and Teams environment are on the same tenant.
+Solution 2: Ensure that the Power Apps environment and Teams environment are on the same tenant.
**Controls fail to load or show an error**
-If the controls fail to load or show an error, it may be a transient issue.
+If the controls fail to load or show an error, it might be a transient issue.
Example: This would render in the console log as: Solution: Refresh your browser or if in Teams app, reload the tab.
With these new controls, you as a maker can drag-and-drop controls that bring Mi
<summary><b>What is the benefit of the Collaboration controls (Preview) for users?</b></summary>
-Your users can experience productivity gains and stay in their flow by collaborating on approvals, files, meetings, notes and tasks without leaving the context of your app.
+Your users can experience productivity gains and stay in their flow by collaborating on approvals, files, meetings, notes, and tasks without leaving the context of your app.
<br>
Request that your Power Platform administrator install the controls from AppSour
<summary><b>How do I add the controls to a Model Driven App?</b></summary>
-Navigate to Form Designer and drag the controls from the Component pane onto a form.
+Go to Form Designer and drag the controls from the Component pane onto a form.
<br>
platform Configure Tasks https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/configure-tasks.md
External tasks that can be assigned to users who aren't part of your organizatio
To enable, you'll need an extra step of passing an XML string to each instance of Tasks PCF control attached to the sub grid component on desired MDA form. XML string is a parametrized query that allows the control to extract the required data from a table that contains customer information. > [!NOTE]
-> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+> Currently, Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
-Following are the steps to create external tasks:
+To create external tasks, follow the steps:
1. Create a new custom entity such as Customer or reuse an existing customer entity like Contacts.
-1. Create new fields that will hold the following information:
+1. Create new fields that hold the following information:
1. Name 1. Email 1. Parent (Lookup to the parent table such as Inspections) > [!NOTE]
- > The customer entity created above will be, where the task control pulls the customer information from when assigning an external task. The Parent field ensures that the customer entity is linked to an Inspection record.
+ > The customer entity created above is, where the task control pulls the customer information from when assigning an external task. The Parent field ensures that the customer entity is linked to an Inspection record.
1. Generate a Fetch XML file to allow the PCF control to pull the right customer information.
Following are the steps to create external tasks:
1. Move through in the classic form designer, until you find the **Tasks** tab. Double-click the subgrid to open its property dialog.
- :::image type="content" source="~/assets/images/collaboration-control/subgrid-property.png" alt-text="Tasks property dialog":::
+ :::image type="content" source="~/assets/images/collaboration-control/subgrid-property.png" alt-text="Screenshot shows the tasks property dialog.":::
1. In the property dialog, set the properties as shown in the following image:
- :::image type="content" source="~/assets/images/collaboration-control/tasks-property.png" alt-text="Tasks property settings":::
+ :::image type="content" source="~/assets/images/collaboration-control/tasks-property.png" alt-text="Sceenshot shows to set the properties in the Tasks property settings.":::
-1. Go to the Controls tab and select :::image type="icon" source="~/assets/images/collaboration-control/edit-icon.png" alt-text="edit tasks"::: on Custom Tasks property to add the Fetch XML generated above.
+1. Go to the Controls tab and select :::image type="icon" source="~/assets/images/collaboration-control/edit-icon.png" alt-text="Screenshot shows how to edit the tasks."::: on Custom Tasks property to add the Fetch XML generated above.
1. Paste the Fetch XML
- :::image type="content" source="~/assets/images/collaboration-control/set-fetchproperties.png" alt-text="Fetch XML property settings":::
+ :::image type="content" source="~/assets/images/collaboration-control/set-fetchproperties.png" alt-text="Screenshot shows how to paste Fetch XML.":::
- :::image type="content" source="~/assets/images/collaboration-control/custom-tasksproperty.png" alt-text="Fetch XML Custom property settings":::
+ :::image type="content" source="~/assets/images/collaboration-control/custom-tasksproperty.png" alt-text="Screenshot shows how to configure Custom property settings.":::
1. Select **Ok** in Configure Property "Custom Tasks" and Set Properties windows.
platform Virtual Table Entity References https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-table-entity-references.md
Collaboration controls virtual entities and their attributes have a one-to-one mapping with a specific Microsoft Graph resource type. For example, the Graph Planner Task entities maps to the [Microsoft Graph Planner Task resource type](/graph/api/resources/plannertask). The virtual entity shares the same attributes as the resource type. > [!NOTE]
-> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+> Currently, Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
## Collaboration controls virtual entities
platform Virtual Tables Api https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-tables-api.md
# Virtual tables Web API
-When using the Dataverse Web API to retrieve multiple records from a virtual table additional query parameters can be included to support sorting, filtering, and pagination. These features aren't supported uniformly across the Collaboration controls virtual tables because they rely on the support provided by the Microsoft Graph API. See the Virtual Tables Entity Reference for details on what each virtual table supports.
+When using the Dataverse Web API to retrieve multiple records from a virtual table additional query parameters can be included to support sorting, filtering, and pagination. These features aren't supported uniformly across the Collaboration controls virtual tables because they rely on the support provided by the Microsoft Graph API. See Virtual Tables Entity Reference for details on what each virtual table supports.
> [!NOTE]
-> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+> Currently, Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
## Virtual table sorting
With the virtual tables, you can use the OData $orderby query parameter to set c
* Graph Event > [!NOTE]
-> Sorting is not supported on all the attributes of the respective Graph resources. If a user tries to sort on a virtual table with an unsupported attribute, this result set will have its default order. This is the same behaviour as the Dataverse Web API on columns that do not support sorting.
+> Sorting is not supported on all the attributes of the respective Graph resources. If a user tries to sort on a virtual table with an unsupported attribute, this result set will have its default order. This is the same behaviour as the Dataverse Web API on columns that don't support sorting.
Examples:
Examples:
## Virtual table filtering
-With the virtual tables, you can use the OData $filter query parameter to set criteria for which rows will be returned. The virtual tables are queried using the same OData operators that are supported by the Dataverse Web API.
+With the virtual tables, you can use the OData $filter query parameter to set criteria for which rows are returned. The virtual tables are queried using the same OData operators that are supported by the Dataverse Web API.
* **Comparison operators**
With the virtual tables, you can use the OData $filter query parameter to set cr
* Graph Event > [!Note]
-> Filtering is not supported on all the attributes of the respective Graph resources. If a user tries to filter on a virtual table with an unsupported attribute, this filter will be ignored. This is the same behaviour as the Dataverse Web API on columns that do not support filtering.
+> Filtering is not supported on all the attributes of the respective Graph resources. If a user tries to filter on a virtual table with an unsupported attribute, this filter is ignored. This is the same behaviour as the Dataverse Web API on columns that don't support filtering.
Examples:
Examples:
Pagination is a useful resource for fetching a large set of records. Virtual Table pagination can be achieved in three different ways.
-You can specify the page size by using the `odata.maxpagesize` preference value in the request header. If the result set spans multiple pages, the response will include the `@odata.nextLink` property. Sample request and response are as following:
+You can specify the page size by using the `odata.maxpagesize` preference value in the request header. If the result set spans multiple pages, the response includes the `@odata.nextLink` property. Sample request and response are as following:
# [Request](#tab/request)
You can specify the number of records to return by passing the `$top` option in
> [!Note]
-> The response will not include the `@nextLink` property. If your use case requires the next page link to be returned, you can use the odata.maxpagesize preference header described in section 1 instead of passing the $top URI parameter.
+> The response won't include the `@nextLink` property. If your use case requires the next page link to be returned, you can use the odata.maxpagesize preference header described in section 1 instead of passing the $top URI parameter.
Currently the following virtual tables support fetching a specific page:
platform Virtual Tables For Tasks https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-tables-for-tasks.md
A new capability with this release is a set of Virtual tables. These enable deve
The Collaboration controls core solution includes a set of [virtual tables](/power-apps/developer/data-platform/virtual-entities/get-started-ve), which can be used for programmatic access to the data created by the Collaboration controls. > [!NOTE]
-> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+> Currently, Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
> [!TIP] > [Virtual tables](/power-apps/developer/data-platform/virtual-entities/get-started-ve) also known as virtual entities, enable the integration of data residing in external systems by seamlessly representing that data as tables in Microsoft Dataverse, without replication of data and often without custom coding.
To follow along with this article, you'll need:
1. A Dataverse environment where the Collaboration controls have been installed. 1. A user account in the Dataverse environment, which has the **Collaboration controls User** role assigned to it.
-1. A third-party tool, for example: Post man or some custom C# code that allows you to authenticate to Microsoft Dataverse instances and to compose and send Web API requests and view responses.
+1. A third-party tool, for example, Post man or some custom C# code that allows you to authenticate to Microsoft Dataverse instances and to compose and send Web API requests and view responses.
> [!TIP] > Microsoft provides information on how to configure a Postman environment that connects to your Dataverse instance and use Postman to perform operations with the Web API. See [Use Postman with Microsoft Dataverse Web API](/power-apps/developer/data-platform/webapi/use-postman-web-api). ## Virtual tables sample scenario
-The scenario described in this guide uses the Planner Plan and Task virtual tables. The scenario described is the same one that the Tasks Collaboration control uses. From a user perspective the scenario shows how a Planner Plan, and several Tasks are created and associated with a specific business record. The scenario goes on to show how to retrieve the tasks associated with the business record and how to read, update and delete a specific planner task.
+The scenario described in this guide uses the Planner Plan and Task virtual tables. The scenario described is the same one that the Tasks Collaboration control uses. From a user perspective the scenario shows how a Planner Plan, and several Tasks are created and associated with a specific business record. The scenario goes on to show how to retrieve the tasks associated with the business record and how to read, update, and delete a specific planner task.
The following sequence diagram explains the interaction between the client, which could be the Tasks collaboration control, the [Collaboration API](/rest/api/industry/collaboration-controls/) and the Planner Plan and Task virtual tables. ## Virtual tables basic operations
Retrieve the Group ID used in [settings for your Collaboration](~/samples/app-wi
A collaboration session is a record in the collaboration root table, which allows you to associate multiple collaborations, for example, tasks, events, appointments with a business record.
-A collaboration session allows you to perform operations such as list of the calendar events associated with a business record, for example an inspections application.
+A collaboration session allows you to perform operations such as list of the calendar events associated with a business record, for example, an inspections application.
# [Request](#tab/request)
A collaboration session allows you to perform operations such as list of the cal
-Keep track of the `collaborationRootId` as it will be needed in subsequent requests.
+Keep track of the `collaborationRootId` as it is needed in subsequent requests.
**Task 3: Create a Planner Plan**
Create a Planner Plan and associate it with the collaboration session created ab
* `collaborationRootId`: Identifies the collaboration session we want to associate this plan with, use the value from task 2
-* `groupId`: Identifies the group who will own this plan, use the value from step 1
+* `groupId`: Identifies the group who owns this plan, use the value from step 1
* `planTitle`: Title for the plan
Create a Planner Plan and associate it with the collaboration session created ab
-Keep track of the`m365_id` as it will be needed in subsequent requests.
+Keep track of the`m365_id` as it is needed in subsequent requests.
**Task 4: Create a Planner Task**
Create a Planner Task with `PlanId` and `collaborationRootId`. you can create se
```
-* `collaborationRootId`: Identifies the collaboration session we want to associate this plan with, us the value from task 2
+* `collaborationRootId`: Identifies the collaboration session we want to associate this plan with, use the value from task 2
* `planId`: Identifies the plan this task will be assigned to, use the value from the previous step * `taskTitle`: Title for the task
Create a Planner Task with `PlanId` and `collaborationRootId`. you can create se
-Keep track of the `m365_graphplannertaskid` as it will be needed in subsequent requests.
+Keep track of the `m365_graphplannertaskid` as it is needed in subsequent requests.
> [!NOTE] > The `m365_graphplannertaskid` is the primary key of the record in the Planner Task virtual table. All subsequent requests to the virtual table to interact with this record must use this primary key. This will be referred to as the `plannerTaskId` in subsequent steps in this document.
platform Using Teams Client Sdk https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/using-teams-client-sdk.md
This code:
```TypeScript import * as microsoftTeams from "@microsoft/teams-js";-
-microsoftTeams.getContext((context: microsoftTeams.Context) => {
- /* ... */
+microsoftTeams.app.getContext().then((context: microsoftTeams.app.Context) => {
+/* ... */
}); ``` Needs to be updated to: ```TypeScript
-import { app, Context } from "@microsoft/teams-js";
+import { app, Context } from "@microsoft/teams-js";
-app.getContext().then((context: Context) => {
- /*...*/
+app.getContext().then((context: app.Context) => {
+/*...*/
}); ``` ...or the equivalent `async/await` pattern: ```TypeScript
-import { app, Context } from "@microsoft/teams-js";
+import { app, Context } from "@microsoft/teams-js";
async function example() {
- const context: Context = await app.getContext();
- /*...*/
-}
+ const context: app.Context = await app.getContext();
+ /*...*/
+ }
```
platform Teamsfx Preview And Customize App Manifest https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-preview-and-customize-app-manifest.md
The following list provides supported placeholders in `manifest.template.json`:
} ```
-2. You can navigate to configuration file by selecting any one of the config placeholders **Go to config file** or **View the state file** in `manifest.template.json`.
+2. You can go to configuration file by selecting any one of the config placeholders **Go to config file** or **View the state file** in `manifest.template.json`.
### Validate manifest
During operations such as, **Zip Teams metadata package**, Teams Toolkit validat
## To preview values for local and dev environment
-In `manifest.template.json`, you can navigate to codelens to preview the values for `local` and `dev` environment.
+In `manifest.template.json`, you can go to codelens to preview the values for `local` and `dev` environment.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/codelens.png" alt-text="Screenshot is an example of showing preview values for local and dev environment."::: > [!NOTE] > Provision the environment or execute local debug to generate values for placeholders.
-You can navigate to state file or configuration file by selecting the codelens, which provides a drop-down list with all the environment names. After selecting one environment, the corresponding state file or configuration file opens.
+You can go to state file or configuration file by selecting the codelens, which provides a drop-down list with all the environment names. After selecting one environment, the corresponding state file or configuration file opens.
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-environment.png" alt-text="Screenshot is an example of showing the selection of an environment.":::
platform Add Single Sign On https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/add-single-sign-on.md
The following table lists the changes Teams Toolkit makes to your project:
|--|--|--| |Create|`aad.template.json` under `template/appPackage`|Azure AD application manifest represents your Azure AD app. `template/appPackage` helps to register an Azure AD app during local debug or provision stage.| |Modify|`manifest.template.json` under `template/appPackage`|A `webApplicationInfo` object is added into your Teams app manifest template. Teams requires this field to enable SSO. The change is in effect when you trigger local debug or provision.|
- |Create|`auth/tab`|Reference code, auth redirect pages and a `README.md` file is generated in this path for a tab project.|
- |Create|`auth/bot`|Reference code, auth redirect pages and a `README.md` file is generated in this path for a bot project.|
+ |Create|`auth/tab`|Reference code, auth redirect pages, and `README.md` files are generated in this path for a tab project.|
+ |Create|`auth/bot`|Reference code, auth redirect pages, and `README.md` files are generated in this path for a bot project.|
> [!Note] > By adding SSO, Teams Toolkit doesn't change anything in the cloud until you trigger local debug. Update your code to ensure that SSO is working in the project. ## Update your application to use SSO
-The following steps help you to enable SSO in your application.
+The following steps help you to enable SSO in your application:
> [!NOTE] > These changes are based on the templates we scaffold.
The following steps help you to enable SSO in your application.
```
-5. Replace the following line: `<AddSSO />` with `<InitTeamsFx />` to replace the `AddSso` component with `InitTeamsFx` component.
+5. Replace the following line:
+
+ `<AddSSO />` with `<InitTeamsFx />` to replace the `AddSso` component with `InitTeamsFx` component.
</details> <details> <summary><b>Bot project </b></summary>
-1. Copy `auth/bot/public` folder to `bot/src`. The two folders contain HTML pages used for auth redirect, you need to modify `bot/src/index` file to add routing to these pages.
-
-2. Copy `auth/bot/sso` folder to `bot/src`. The two folders contain three files as reference for SSO implementation:
-
- * `showUserInfo`: It implements a function to get user info with SSO token. You can follow this to create your own method that requires SSO token.
-
- * `ssoDialog`: It creates a [ComponentDialog](/javascript/api/botbuilder-dialogs/componentdialog?view=botbuilder-ts-latest&preserve-view=true) that is used for SSO.
-
- * `teamsSsoBot`: It creates a [TeamsActivityHandler](/javascript/api/botbuilder/teamsactivityhandler?view=botbuilder-ts-latest&preserve-view=true) with `ssoDialog` and add `showUserInfo` as a command that can be triggered.
+#### Set up the Azure AD redirects
-3. Follow the code sample and register your own command with `addCommand` in this file (optional).
+1. Move the `auth/bot/public` folder to `bot/src`. This folder contains HTML pages that the bot application hosts. When single sign-on flow is initiated with Azure AD, it redirects the user to the HTML pages.
+1. Modify your `bot/src/index` to add the appropriate `restify` routes to HTML pages.
-4. Execute `npm install isomorphic-fetch` under `bot/`.
-
-5. Execute `npm install copyfiles` under `bot/` and replace following line in package.json:
-
- ```JSON
-
- "build": "tsc --build",
+ ```ts
+ const path = require("path");
+ server.get(
+ "/auth-*.html",
+ restify.plugins.serveStatic({
+ directory: path.join(__dirname, "public"),
+ })
+ );
```
- with
-
- ```JSON
-
- "build": "tsc --build && copyfiles public/*.html lib/",
-
- ```
-
- The HTML pages used for auth redirect are copied while building this bot project.
-
-6. After you add the following files, you need to create a new `teamsSsoBot` instance in `bot/src/index` file. Replace the following code:
-
- ```Bash
-
- // Process Teams activity with Bot Framework.
- server.post("/api/messages", async (req, res) => {
- await commandBot.requestHandler(req, res);
- });
-
- ```
-
- with
-
- ```Bash
-
- const handler = new TeamsSsoBot();
- // Process Teams activity with Bot Framework.
- server.post("/api/messages", async (req, res) => {
- await commandBot.requestHandler(req, res, async (context)=> {
- await handler.run(context);
- });
- });
-
- ```
-
-7. Add the HTML routes in the `bot/src/index` file:
+#### Update your app
- ```Bash
+SSO command handler `ProfileSsoCommandHandler` uses an Azure AD token to call Microsoft Graph. This token is obtained by using the logged-in Teams user token. The flow is brought together in a dialog that displays a consent dialog if necessary.
- server.get(
- "/auth-*.html",
- restify.plugins.serveStatic({
- directory: path.join(__dirname, "public"),
- })
- );
+1. Move `profileSsoCommandHandler` file under `auth/bot/sso` folder to `bot/src`. `ProfileSsoCommandHandler` class is an SSO command handler to get user info with SSO token, follow this method and create your own SSO command handler.
+1. Open `package.json` file and ensure that teamsfx SDK version >= 1.2.0
+1. Execute the `npm install isomorphic-fetch --save` command in `bot` folder.
+1. For ts script, execute the `npm install copyfiles --save-dev` command in `bot` folder and replace following lines in `package.json`:
- ```
-
-8. Add the following lines to `bot/src/index` to import `teamsSsoBot` and `path`:
+ ```json
+ "build": "tsc --build && shx cp -r ./src/adaptiveCards ./lib/src",
+ ```
- ```Bash
+ with
- // For ts:
- import { TeamsSsoBot } from "./sso/teamsSsoBot";
- const path = require("path");
+ ```json
+ "build": "tsc --build && shx cp -r ./src/adaptiveCards ./lib/src && copyfiles src/public/*.html lib/",
+ ```
- // For js:
- const { TeamsSsoBot } = require("./sso/teamsSsoBot");
- const path = require("path");
+ This copies the HTML pages used for auth redirect when building the bot project.
- ```
+1. To make SSO consent flow work, replace the following code in `bot/src/index` file:
-9. Register your command in the Teams app manifest. Open `templates/appPackage/manifest.template.json`, and add following lines under `command` in `commandLists` of your bot:
+ ```ts
+ server.post("/api/messages", async (req, res) => {
+ await commandBot.requestHandler(req, res);
+ });
+ ```
- ```JSON
+ with
+
+ ```ts
+ server.post("/api/messages", async (req, res) => {
+ await commandBot.requestHandler(req, res).catch((err) => {
+ // Error message including "412" means it is waiting for user's consent, which is a normal process of SSO, sholdn't throw this error.
+ if (!err.message.includes("412")) {
+ throw err;
+ }
+ });
+ });
+ ```
- {
- "title": "show",
- "description": "Show user profile using Single Sign On feature"
- }
+1. Replace the options for `ConversationBot` instance in `bot/src/internal/initialize` to add the SSO config and SSO command handler:
- ```
+ ```ts
+ export const commandBot = new ConversationBot({
+ ...
+ command: {
+ enabled: true,
+ commands: [new HelloWorldCommandHandler()],
+ },
+ });
+ ```
-</details>
-<details>
-<summary><b>Add a new command to the bot
-</b></summary>
+ with
+
+ ```ts
+ import { ProfileSsoCommandHandler } from "../profileSsoCommandHandler";
+
+ export const commandBot = new ConversationBot({
+ ...
+ // To learn more about ssoConfig, please refer teamsfx sdk document: https://docs.microsoft.com/microsoftteams/platform/toolkit/teamsfx-sdk
+ ssoConfig: {
+ aad :{
+ scopes:["User.Read"],
+ },
+ },
+ command: {
+ enabled: true,
+ commands: [new HelloWorldCommandHandler() ],
+ ssoCommands: [new ProfileSsoCommandHandler()],
+ },
+ });
+ ```
-> [!NOTE]
-> Currently, these instructions applies to `command bot`. If you start with a `bot`, see [bot-sso sample](https://github.com/OfficeDev/TeamsFx-Samples/tree/v2/bot-sso).
-
-The following steps help you to add a new command, after you add SSO in your project:
-
-1. Create a new file (`todo.ts` or `todo.js`) under `bot/src/` and add your own business logic to call Graph API:
-
-# [TypeScript](#tab/typescript)
-
- ```typescript
- // for TypeScript:
-export async function showUserImage(
- context: TurnContext,
- ssoToken: string,
- param: any[]
-): Promise<DialogTurnResult> {
- await context.sendActivity("Retrieving user photo from Microsoft Graph ...");
-
- // Init TeamsFx instance with SSO token
- const teamsfx = new TeamsFx().setSsoToken(ssoToken);
-
- // Update scope here. For example: Mail.Read, etc.
- const graphClient = createMicrosoftGraphClient(teamsfx, param[0]);
-
- // You can add following code to get your photo:
- // let photoUrl = "";
- // try {
- // const photo = await graphClient.api("/me/photo/$value").get();
- // photoUrl = URL.createObjectURL(photo);
- // } catch {
- // // Could not fetch photo from user's profile, return empty string as placeholder.
- // }
- // if (photoUrl) {
- // await context.sendActivity(
- // `You can find your photo here: ${photoUrl}`
- // );
- // } else {
- // await context.sendActivity("Could not retrieve your photo from Microsoft Graph. Please make sure you have uploaded your photo.");
- // }
-
- return;
-}
- ```
-
-# [JavaScript](#tab/javascript)
-
- ```javaScript
- // for JavaScript:
-export async function showUserImage(context, ssoToken, param) {
- await context.sendActivity("Retrieving user photo from Microsoft Graph ...");
-
- // Init TeamsFx instance with SSO token
- const teamsfx = new TeamsFx().setSsoToken(ssoToken);
-
- // Update scope here. For example: Mail.Read, etc.
- const graphClient = createMicrosoftGraphClient(teamsfx, param[0]);
-
- // You can add following code to get your photo:
- // let photoUrl = "";
- // try {
- // const photo = await graphClient.api("/me/photo/$value").get();
- // photoUrl = URL.createObjectURL(photo);
- // } catch {
- // // Could not fetch photo from user's profile, return empty string as placeholder.
- // }
- // if (photoUrl) {
- // await context.sendActivity(
- // `You can find your photo here: ${photoUrl}`
- // );
- // } else {
- // await context.sendActivity("Could not retrieve your photo from Microsoft Graph. Please make sure you have uploaded your photo.");
- // }
-
- return;
-}
- ```
+1. Register your command in the Teams app manifest. Open `templates/appPackage/manifest.template.json`, and add following lines under `commands` in `commandLists` of your bot:
-
+ ```json
+ {
+ "title": "profile",
+ "description": "Show user profile using Single Sign On feature"
+ }
+ ```
-2. Register a new command
+#### Add a new SSO command to the bot (Optional)
+
+After successfully adding SSO in your project, you can add a new SSO command.
+
+1. Create a new file such as `photoSsoCommandHandler.ts` or `photoSsoCommandHandler.js` in `bot/src/` and add your own SSO command handler to call Graph API:
+
+ ```TypeScript
+ // for TypeScript:
+ import { Activity, TurnContext, ActivityTypes } from "botbuilder";
+ import "isomorphic-fetch";
+ import {
+ CommandMessage,
+ TriggerPatterns,
+ TeamsFx,
+ createMicrosoftGraphClient,
+ TeamsFxBotSsoCommandHandler,
+ TeamsBotSsoPromptTokenResponse,
+ } from "@microsoft/teamsfx";
+
+ export class PhotoSsoCommandHandler implements TeamsFxBotSsoCommandHandler {
+ triggerPatterns: TriggerPatterns = "photo";
+
+ async handleCommandReceived(
+ context: TurnContext,
+ message: CommandMessage,
+ tokenResponse: TeamsBotSsoPromptTokenResponse,
+ ): Promise<string | Partial<Activity> | void> {
+ await context.sendActivity("Retrieving user information from Microsoft Graph ...");
+
+ const teamsfx = new TeamsFx().setSsoToken(tokenResponse.ssoToken);
+
+ const graphClient = createMicrosoftGraphClient(teamsfx, ["User.Read"]);
+
+ let photoUrl = "";
+ try {
+ const photo = await graphClient.api("/me/photo/$value").get();
+ const arrayBuffer = await photo.arrayBuffer();
+ const buffer=Buffer.from(arrayBuffer, 'binary');
+ photoUrl = "data:image/png;base64," + buffer.toString("base64");
+ } catch {
+ // Could not fetch photo from user's profile, return empty string as placeholder.
+ }
+ if (photoUrl) {
+ const photoMessage: Partial<Activity> = {
+ type: ActivityTypes.Message,
+ text: 'This is your photo:',
+ attachments: [
+ {
+ name: 'photo.png',
+ contentType: 'image/png',
+ contentUrl: photoUrl
+ }
+ ]
+ };
+ return photoMessage;
+ } else {
+ return "Could not retrieve your photo from Microsoft Graph. Please make sure you have uploaded your photo.";
+ }
+ }
+ }
+ ```
- * Add the following line for new command registration using `addCommand` in `teamsSsoBot`:
+ ```javascript
+ // for JavaScript:
+ const { ActivityTypes } = require("botbuilder");
+ require("isomorphic-fetch");
+ const { createMicrosoftGraphClient, TeamsFx } = require("@microsoft/teamsfx");
+
+ class PhotoSsoCommandHandler {
+ triggerPatterns = "photo";
+
+ async handleCommandReceived(context, message, tokenResponse) {
+ await context.sendActivity("Retrieving user information from Microsoft Graph ...");
+
+ const teamsfx = new TeamsFx().setSsoToken(tokenResponse.ssoToken);
+
+ const graphClient = createMicrosoftGraphClient(teamsfx, ["User.Read"]);
+
+ let photoUrl = "";
+ try {
+ const photo = await graphClient.api("/me/photo/$value").get();
+ const arrayBuffer = await photo.arrayBuffer();
+ const buffer=Buffer.from(arrayBuffer, 'binary');
+ photoUrl = "data:image/png;base64," + buffer.toString("base64");
+ } catch {
+ // Could not fetch photo from user's profile, return empty string as placeholder.
+ }
+ if (photoUrl) {
+ const photoMessage = {
+ type: ActivityTypes.Message,
+ text: 'This is your photo:',
+ attachments: [
+ {
+ name: 'photo.png',
+ contentType: 'image/png',
+ contentUrl: photoUrl
+ }
+ ]
+ };
+ return photoMessage;
+ } else {
+ return "Could not retrieve your photo from Microsoft Graph. Please make sure you have uploaded your photo.";
+ }
+ }
+ }
+
+ module.exports = {
+ PhotoSsoCommandHandler,
+ };
- ```bash
+ ```
- this.dialog.addCommand("ShowUserProfile", "show", showUserInfo);
+1. Add `PhotoSsoCommandHandler` instance to `ssoCommands` array in `bot/src/internal/initialize.ts`:
- ```
+ ```ts
+ // for TypeScript:
+ import { PhotoSsoCommandHandler } from "../photoSsoCommandHandler";
- * Add following lines after the above line to register a new command `photo` and hook up with method `showUserImage` added above:
+ export const commandBot = new ConversationBot({
+ ...
+ command: {
+ ...
+ ssoCommands: [new ProfileSsoCommandHandler(), new PhotoSsoCommandHandler()],
+ },
+ });
+ ```
- ```bash
+ ```javascript
+ // for JavaScript:
+ ...
+ const { PhotoSsoCommandHandler } = require("../photoSsoCommandHandler");
- // As shown here, you can add your own parameter into the `showUserImage` method
- // You can also use regular expression for the command here
- const scope = ["User.Read"];
- this.dialog.addCommand("ShowUserPhoto", new RegExp("photo\s*.*"), showUserImage, scope);
+ const commandBot = new ConversationBot({
+ ...
+ command: {
+ ...
+ ssoCommands: [new ProfileSsoCommandHandler(), new PhotoSsoCommandHandler()]
+ },
+ });
+ ...
- ```
+ ```
-3. Register your command in the Teams app manifest. Open `templates/appPackage/manifest.template.json`, and add following lines under `command` in `commandLists` of your bot:
+1. Register your command in the Teams app manifest. Open `templates/appPackage/manifest.template.json`, and add following lines under `commands` in `commandLists` of your bot:
- ```JSON
+ ```JSON
- {
- "title": "photo",
- "description": "Show user photo using Single Sign On feature"
- }
+ {
+ "title": "photo",
+ "description": "Show user photo using Single Sign On feature"
+ }
- ```
+ ```
</details> <br>
Press F5 to debug your application. Teams Toolkit uses the Azure AD manifest fil
## Customize Azure AD application registration
-The [Azure AD app manifest](/azure/active-directory/develop/reference-app-manifest) allows you to customize various aspects of application registration. You can update the manifest as needed. If you need to include additional API permissions to access your desired APIs, see [API permissions to access your desired APIs](https://github.com/OfficeDev/TeamsFx/wiki/#customize-aad-manifest-template).
-To view your Azure AD application in Azure Portal, see [View Azure AD application in Azure portal](https://github.com/OfficeDev/TeamsFx/wiki/Manage-AAD-application-in-Teams-Toolkit#How-to-view-the-AAD-app-on-the-Azure-portal).
+The [Azure AD app manifest](/azure/active-directory/develop/reference-app-manifest) allows you to customize various aspects of application registration. You can update the manifest as needed. If you need to include more API permissions to access your desired APIs, see [API permissions to access your desired APIs](https://github.com/OfficeDev/TeamsFx/wiki/#customize-aad-manifest-template).
+To view your Azure AD application in Azure portal, see [View Azure AD application in Azure portal](https://github.com/OfficeDev/TeamsFx/wiki/Manage-AAD-application-in-Teams-Toolkit#How-to-view-the-AAD-app-on-the-Azure-portal).
## SSO authentication concepts
platform Faq https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/faq.md
FAQ for [Provision cloud resources using Teams Toolkit](provision.md)
<summary><b>How to troubleshoot?</b></summary>
-If you get errors with Teams Toolkit in Visual Studio Code, you can select **Get Help** on the error notification to navigate to the related document. If you're using TeamsFx CLI, there will be a hyperlink at the end of error message that points to the help doc. You can also view [provision help doc](https://aka.ms/teamsfx-arm-help) directly.
+If you get errors with Teams Toolkit in Visual Studio Code, you can select **Get Help** on the error notification to go to the related document. If you're using TeamsFx CLI, there will be a hyperlink at the end of error message that points to the help doc. You can also view [provision help doc](https://aka.ms/teamsfx-arm-help) directly.
<br>
platform Install Teams Toolkit https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/install-Teams-Toolkit.md
zone_pivot_groups: teams-app-platform
# Install Teams Toolkit
-Teams Toolkit is an extension in both Visual Studio and Visual Studio Code. In this document you can learn, how to install Teams Toolkit.
+This article describes how to install the Teams Toolkit extension.
+
+## Prerequisites
::: zone pivot="visual-studio-code"
-## Install Teams Toolkit for Visual Studio Code
+Before installing Teams Toolkit for Visual Studio Code, you'll need to [download and install Visual Studio Code](https://code.visualstudio.com/Download).
++
-Before you start with installation, you need to have Visual Studio Code and Teams client installed.
+Before installing Teams Toolkit for Visual Studio, you'll need to [download and install Visual Studio 2022](https://aka.ms/VSDownload) using the Visual Studio Installer.
-## Steps to install Teams Toolkit
++
+## Install Teams Toolkit for Visual Studio Code
-You can install Teams Toolkit from an extension in Visual Studio Code and from Visual Studio Code Marketplace. The following steps help you to install Teams Toolkit:
+You can install Teams Toolkit using the Extensions window in Visual Studio Code, or install it from the Visual Studio Marketplace.
# [Visual Studio Code](#tab/vscode)
-1. Open **Visual Studio Code**.
-1. Select the Extensions view (**Ctrl+Shift+X** / **⌘⇧-X** or **View > Extensions**).
+1. Launch **Visual Studio Code**.
+1. Open the Extensions window (**Ctrl+Shift+X** / **⌘⇧-X** or **View > Extensions**).
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/install toolkit-1.png" alt-text="install":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/install toolkit-1.png" alt-text="Screenshot shows how to install.":::
1. Enter **Teams Toolkit** in the search box.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/install-toolkit2.png" alt-text="Toolkit":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/install-toolkit2.png" alt-text="Screenshot show the Toolkit.":::
1. Select **Install**.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-install-ttk.png" alt-text="install toolkit 4.0.0":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-install-ttk.png" alt-text="Screenshot shows install toolkit 4.0.0.":::
- After successful installation of Teams Toolkit in Visual Studio Code, Teams Toolkit icon appears in the Visual Studio Code toolbar.
+ After successful installation of Teams Toolkit in Visual Studio Code, a Teams Toolkit icon appears in the Visual Studio Code toolbar.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/after-install.png" alt-text="After install":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/after-install.png" alt-text="Screenshot shows after install view.":::
# [Marketplace](#tab/marketplace)
-1. Open [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension).
+1. Go to [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) in a web browser.
- The following page appears.
-
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/install-ttk-marketplace.png" alt-text="install TTK Marketplace":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/install-ttk-marketplace.png" alt-text="Screenshot shows the installation of TTK Marketplace.":::
1. Select **Install**.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/Install-ttk.png" alt-text="install TTK":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/Install-ttk.png" alt-text="Screenshot shows how to install TTK.":::
-1. From the pop-up window, select **Open**.
+1. From the pop-up window, select **Open** to launch Visual Studio Code.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-open.png" alt-text="Select the open":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-open.png" alt-text="Screenshot shows to select the open.":::
- The following Visual Studio Code page appears.
+ The Teams Toolkit extension page is shown in Visual Studio Code:
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/ttk-in-vsc.png" alt-text="Select TTK in VSC":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/ttk-in-vsc.png" alt-text="Screenshot shows how to select TTK in VSC.":::
1. Select **Install**.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-install-ttk.png" alt-text="Select Install TTK in VSC":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/select-install-ttk.png" alt-text="Screenshot shows how to select Install TTK in VSC.":::
- After successful installation of Teams Toolkit in Visual Studio Code, Teams Toolkit icon appears in the Visual Studio Code toolbar.
+ After successful installation of Teams Toolkit in Visual Studio Code, a Teams Toolkit icon appears in the Visual Studio Code toolbar.
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/after-install.png" alt-text="After install":::
+ :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/after-install.png" alt-text="Screenshot shows the after installation view.":::
-#### Upgrade Teams Toolkit
+## Installing a different release version
-Teams Toolkit is upgraded to the latest version by default. The following steps help you to install different version:
+By default, Visual Studio Code automatically keeps Teams Toolkit up-to-date. If you want to install a different version, follow the steps:
-* Select the Extensions :::image type="icon" source="../assets/images/teams-toolkit-v2/extension icon.PNG"::: icon.
+* Select the Extensions (:::image type="icon" source="../assets/images/teams-toolkit-v2/extension icon.PNG":::) icon from the Visual Studio Code toolbar.
* Enter **Teams Toolkit** in the search box.
-* In Teams Toolkit extension, select :::image type="icon" source="../assets/images/teams-toolkit-v2/setting icon.PNG"::: icon.
-* Select **Install Another Version** for upgrade to the latest version of Teams Toolkit.
+* On the Teams Toolkit page, select the drop-down arrow next to the **Uninstall** button.
+* Select **Install Another Version...** from the menu and choose which version to install.
+
+## Installing a pre-release version
+
+The Teams Toolkit for Visual Studio Code extension is also available on GitHub. To download pre-releases, go to the [Releases page on GitHub](https://github.com/OfficeDev/TeamsFx/releases) and look for extension downloads marked as Pre-release.
::: zone-end
Teams Toolkit is upgraded to the latest version by default. The following steps
## Install Teams Toolkit for Visual Studio
-Before you start with installation, you need to install Visual Studio Installer.
-
-You can download the latest Visual Studio Installer from the [Visual Studio download page](https://visualstudio.microsoft.com).
-
-## Steps to install Teams Toolkit
+ > [!IMPORTANT]
+ > We recommend using Visual Studio 2022 version 17.3.3 or newer for Teams Toolkit, which is the latest release to fix several known issues in previous versions of Visual Studio.
-After you open the Visual Studio Installer, in the pop-up Workloads window:
+1. [Download the Visual Studio installer](https://aka.ms/VSDownload), or open it if already installed.
+2. Select **Install**, or **Modify** if Visual Studio is already installed.
+3. Select the **Workloads** tab, then select the **ASP.NET and web development** workload.
+4. On the right, select the **Microsoft Teams development tools** in the **Optional** section of the **Installation details** panel.
+5. Select **Modify** or **Install** to complete the installation.
-1. Select the **ASP.NET and web development** workload.
-1. Select the **Microsoft Teams development tools** in **Installation details** panel.
-1. Select **Install**.
+ :::image type="content" source="../assets/images/teams-toolkit-overview/visual-studio-install_1.png" alt-text="Screenshot shows how to install Visual studio.":::
- :::image type="content" source="../assets/images/teams-toolkit-overview/visual-studio-install_1.png" alt-text="Visual studio-installation":::
+6. After the installation completes, select **Launch** to open Visual Studio..
-1. Select **Launch** to open Visual Studio.
+ :::image type="content" source="../assets/images/teams-toolkit-overview/visual-studio-launch_1.png" alt-text="Screenshot shows how to launch visual studio.":::
- :::image type="content" source="../assets/images/teams-toolkit-overview/visual-studio-launch_1.png" alt-text="Launch visual studio":::
- > [!IMPORTANT]
- > You're recommended to download Visual Studio 2022 version 17.3.3, since Teams Toolkit for Visual Studio is GA in this version. This article is written for Visual Studio 2022 version 17.3.3. Teams Toolkit version 17.3.* or higher.
+## Next steps
+Now that Teams Toolkit is installed, visit [Create a new Teams project](create-new-project.md) to get started.
## See also
platform Teams Toolkit Fundamentals https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/teams-toolkit-fundamentals.md
zone_pivot_groups: teams-app-platform
# Teams Toolkit Overview
-Teams Toolkit is a capability feature which allows you to perform multi-functions in both Microsoft Visual Studio Code as well as Visual Studio. With the help of Teams Toolkit you can automate the process from creating to deploying and customizing your app. The various features and advantages of Teams Toolkit are discussed in the respective documentation for the environments you choose.
--
-## Teams Toolkit Overview for Visual Studio Code
-
-Teams Toolkit lets you create, debug, and deploy your Teams app right from Visual Studio Code.App development with the toolkit has the following advantages:
-
-* Integrated identity
-* Access to cloud storage
-* Data from Microsoft Graph
-* Azure and Microsoft 365 services with zero-configuration approach.
-
-For Teams app development, similar to Teams Toolkit for Visual Studio, you can use [CLI tool](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/cli/user-manual.md), which consists of Toolkit `teamsfx`.
-
-## User journey of Teams Toolkit
-
-Teams Toolkit automates manual work and provides great integration of Teams and Azure resources. The following image shows Teams Toolkit user journey:
- :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/teams-toolkit-user-journey2.png" alt-text="User Journey of the Teams Toolkit" lightbox="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/teams-toolkit-user-journey2.png":::
-The main milestones of this journey are:
-
-1. Start by creating a new project or trying a sample Teams app.
-1. Add capabilities or edit manifest file as needed.
-1. Use Microsoft 365 account to build and debug your Teams app.
-1. Use Azure account to provision and deploy your app to cloud.
-1. Publish your app to Teams.
-
-The following table helps you to get the overview of Teams Toolkit in Visual Studio Code:
+Teams Toolkit makes it simple to get started with app development for Microsoft Teams using Visual Studio and Visual Studio Code.
-| Process | Description |
-| - | - |
-| Install Teams Toolkit | You can install Teams Toolkit in two ways: <br> - Using Visual Studio Code <br> - Using Visual Studio Code Marketplace|
-| Support for build environments | You have two different types of environment: <br> - Javascript or Typescript <br> - SPFx |
-| Support for app types and Azure function | There are two different types of apps: <br> - Capability-based app such as tab, bot, message extension <br> - Scenario-based Teams app such as notification bot, command bot and SSO enabled personal tab |
-| Develop your Teams app | It contains: <br> - Add and manage environment <br> - Create multi-capability app <br> - Create capability based cloud resources <br> - Integrate third party API <br> - Customize manifest file <br> - TeamsFx SDK |
-| Debug your Teams app | It contains: <br> - Debug your Teams app locally <br> - Debug background process|
-| Host your Teams app | It contains: <br> - Provision resources to the cloud <br> - Deploy to the cloud|
-| Test your Teams app | It contains: <br> - Integrate and collabrate <br> - Zip Teams metadata package <br> - Sideload and test app in Teams environment <br> - Test app behavior in different environment|
-| Publish your Teams app | It contains: <br> - Publish your app <br> - Manage admin approval <br> - Publish to store <br> - Integrate with Developer Portal |
+* Start with a project template or from a sample
+* Save setup time with automated app registration and configuration
+* Run and debug to Teams directly from familiar tools
+* Smart defaults for hosting in Azure using infrastructure-as-code and Bicep
+* Create unique configurations like dev, test, and prod using the Environments feature
+* Bring your app to your organization or the Teams App Store using built-in publishing tools
-### Entities integrated with Teams Toolkit
-
-Teams Toolkit is an extension in Visual Studio Code. It is integrated with the following entities within Teams Toolkit.such as Azure AD and Microsoft 365, Developer Portal and Microsoft graph. All the entities are integrated within Teams Toolkit and help users to create an app.
+## Available for Visual Studio and Visual Studio Code
-| Entities | Description |
-| - | - |
-| Azure AD | Azure Active Directory (Azure AD) is a cloud-based identity and access management service. This service helps your employees access external resources, such as Microsoft 365, the Azure portal, and thousands of other SaaS applications. |
-| Microsoft 365 | Teams developer account while developing an app.|
-| Developer Portal | The Developer Portal for Teams is the primary tool for configuring, distributing, and managing your Microsoft Teams apps. With the Developer Portal, you can collaborate with colleagues on your app, set up runtime environments, and much more. |
-| Microsoft Graph | Microsoft Graph is the gateway to data and intelligence in Microsoft 365. It provides a unified programmability model that you can use to access the tremendous amount of data in Microsoft 365, Windows, and Enterprise Mobility + Security. |
+Teams Toolkit is available for free for Visual Studio Code and supports Visual Studio 2022 Community, Professional, and Enterprise. Visit the [Install Teams Toolkit documentation](./install-Teams-Toolkit.md) for more information about installation and setup.
-Teams Toolkit brings all tools needed for building a Teams app in one place.
+| Teams Toolkit | Visual Studio | Visual Studio Code |
+| - | - | |
+| Installation | Available in the Visual Studio Installer | Available in the VS Marketplace |
+| Build with | C#, .NET, ASP.NET, Blazor | JavaScript, TypeScript, React, SPFx |
-## Manage your apps using Developer Portal
+## Features
-As Teams Toolkit is integrated with Developer Portal, you can configure, distribute, and manage your app using [Developer Portal for Teams](../concepts/build-and-test/teams-developer-portal.md) under DEPLOYMENT after creating an app. For more information, see [manage your Teams apps using Developer Portal](../concepts/build-and-test/manage-your-apps-in-developer-portal.md).
+### Project templates
+Teams Toolkit reduces the complexity of getting started with templates for common line-of-business app scenarios and smart defaults to accelerate your time to production. If you're already familiar with Teams app development, you can also start directly with capability-focused templates. i.e. Tab, Bot, Messaging Extension.
::: zone-end ::: zone pivot="visual-studio"
-## Teams Toolkit overview for Visual Studio
-
-Teams Toolkit for Visual Studio helps you to create, debug and deploy Microsoft Teams apps. Teams Toolkit for Visual Studio is GA in Visual Studio 2022 version 17.3. App development with Teams Toolkit has the advantages of:
-
-* Integrated identity
-* Access to cloud storage
-* Data from Microsoft Graph
-* Azure and Microsoft 365 services with zero-configuration approach
-
-For Teams app development, you can also use [CLI tool](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/cli/user-manual.md), similar to Teams Toolkit for Microsoft Visual Studio code that includes Toolkit `teamsfx`.
+### Automatic registration and configuration
-Teams Toolkit brings all the tools needed to build a Teams app in one place.
+Save time and let the toolkit automatically register the app in Teams Developer Portal and configure settings like Azure Active Directory automatically when you first run or debug the app. Sign in with your Microsoft 365 account to control where the app is configured and customize the included Azure AD manifest when you need more flexibility.
-> [!NOTE]
-> Teams Toolkit is not available in other versions.
-## User Journey of Teams Toolkit
+### Multiple environments
-Teams Toolkit automates manual work and provides you with great integration of Teams and Azure resources. The following image shows the user journey:
+With the Environments features, you can create different groupings of cloud resources to make it simpler to run and test your app. Use the "dev" environment with your Azure subscription or create a new one with a different subscription for staging, test, and production.
+### Quick access to Teams Developer Portal
-The main milestones of this journey are:
+Quickly access Teams Developer Portal, where you can configure, distribute, and manage your app. For more information, seeΓÇ»[manage your Teams apps using Developer Portal](../concepts/build-and-test/manage-your-apps-in-developer-portal.md).
-1. You can start by creating a new project or try building a sample Teams app.
-1. You can then edit code or the manifest file as required.
-1. For building and debugging the Teams app you can use your Microsoft 365 account.
-1. For provisioning and deploying your app to cloud you can use your Azure account.
-1. You can finally publish your app to Teams.
-The following operations aren't supported in Teams Toolkit for Visual Studio yet compared to Teams Toolkit for Microsoft Visual Studio Code, however they're planned in the future product road map.
-* Add another Teams capabilities to your Teams app.
-* Add more Azure resources to your Teams app
-* Add Single Sign-on (SSO) to your Teams app.
-* Add API connection to your Teams app.
-* Customize Microsoft Azure Active Directory (Azure AD) manifest.
-* Add CI/CD pipelines.
-* Manage multiple cloud environments.
-* Collaborate on Teams projects.
-* Publish Teams app.
-### TeamsFx .NET SDK Reference docs
+#### TeamsFx .NET SDK Reference docs
* [Microsoft.Extensions.DependencyInjection Namespace](/../dotnet/api/Microsoft.Extensions.DependencyInjection) * [Microsoft.TeamsFx Namespace](/../dotnet/api/Microsoft.TeamsFx)
The following operations aren't supported in Teams Toolkit for Visual Studio yet
* [Create new Teams app in Visual Studio](create-new-teams-app-for-Visual-Studio.md) * [Provision cloud resources using Visual Studio](provision-cloud-resources.md) * [Deploy Teams app to the cloud using Visual Studio](deploy-teams-app.md)-
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Discover Microsoft Teams platform features that are generally available (GA). Yo
:::row::: :::column::: :::column-end::: :::column span="2":::
Microsoft Teams platform features that are available to all app developers.
**2022 September**
+* ***September 30, 2022***: [Manage SaaS licenses for third party apps in Teams](concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md#manage-license-for-third-party-apps-in-teams)
* ***September 29, 2022***: [Teams mobile app now supports file downloads to local devices.](concepts/device-capabilities/media-capabilities.md#file-download-on-teams-mobile)
-* ***September 29, 2022***: [Generate a deep link to share content to stage in meetings.](concepts/build-and-test/deep-links.md#generate-a-deep-link-to-share-content-to-stage-in-meetings)
* ***September 16, 2022***: [Adaptive Cards in search based message extensions now support Universal Actions.](messaging-extensions/how-to/search-commands/universal-actions-for-search-based-message-extensions.md) * ***September 06, 2022***: [Introduced code snippets for capturing videos using camera through `selectMedia` API.](concepts/device-capabilities/media-capabilities.md#code-snippets)
Explore updates from the previous GA releases listed here.
</details> </details> </details>+ ::: zone-end ::: zone pivot="dev-preview"
Discover Microsoft Teams platform features that are in developer preview. You ca
:::row::: :::column::: :::column-end::: :::column span="2":::
Discover Microsoft Teams platform features that are deprecated. You can now get
:::row::: :::column::: :::column-end::: :::column span="2":::