Updates from: 03/11/2022 02:34:11
Service Microsoft Docs article Related commit history on GitHub Change details
platform Bot Features https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/bot-features.md
The [Bot Framework](https://dev.botframework.com/) is a rich SDK used to create
[Power Virtual Agents](/power-virtual-agents/fundamentals-what-is-power-virtual-agents) is a chatbot service built on the Microsoft Power platform and Bot Framework. The Power Virtual Agent development process uses a guided, no-code, and graphical interface approach that empowers your team members to easily create and maintain an intelligent virtual agent. After creating your chatbot in the [Power Virtual Agents portal](https://powervirtualagents.microsoft.com), you can easily [integrate it with Teams](how-to/add-power-virtual-agents-bot-to-teams.md). For more information on getting started, see [Power Virtual Agents documentation](/power-virtual-agents).
+>[!NOTE]
+>You must not use Microsoft Power Platform to create apps that are to be published to the Teams app store. Microsoft Power Platform apps can be published to an organizationΓÇÖs app store only.
+ ## Bots with webhooks and connectors Webhooks and connectors connect your bot to your web services. Using webhooks and connectors, you can create a simple bot for basic interaction, such as creating a workflow or other simple commands. They are available only in the team where you create them and are intended for simple processes specific to your company's workflow. For more information, see [what are webhooks and connectors](~/webhooks-and-connectors/what-are-webhooks-and-connectors.md).
platform Call Notifications https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/call-notifications.md
Location: your-new-location
Enable your bot to answer an incoming call using the [answer](/graph/api/call-answer?view=graph-rest-1.0&tabs=http&preserve-view=true) API. You can specify the `callbackUri` to handle this particular call. This is useful for stateful instances where your call is handled by a particular partition, and you want to embed this information in the `callbackUri` for routing to the right instance. - The next section provides details on authenticating the callback by inspecting the token posted to your webhook. ## Authenticate the callback
platform Debugging Local Testing Calling Meeting Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/debugging-local-testing-calling-meeting-bots.md
Last updated 11/18/2018
In [Run and debug your app](../../concepts/build-and-test/debug.md) we explain how to use [ngrok](https://ngrok.com) to create a tunnel between your local computer and the internet. In this topic, learn how you can also use ngrok and your local PC to develop bots that support calls and online meetings.
-Messaging bots use HTTP, but calls and online meeting bots use the lower-level TCP. Ngrok supports TCP tunnels in addition to HTTP tunnels.
+Messaging bots use HTTP, but calls and online meeting bots use the lower-level TCP. Ngrok supports TCP tunnels in addition to HTTP tunnels.
## Configure ngrok.yml
statefulClientBuilder.SetNotificationUrl(
> Replace signal with the one provided by ngrok and the `NotificationEndpoint` with the controller path that receives notification. > [!IMPORTANT]
+>
> * The URL in `SetNotificationUrl` must be HTTPS.
->
+>
> Your local instance must be listening to HTTP traffic on the signaling port. The requests made by the calls and online meetings platform will reach the bot as localhost HTTP traffic unless end-to-end encryption is set up. #### Update media
var mediaPlatform = new MediaPlatformSettings
## Caveats -- Ngrok free accounts **don't** provide end-to-end encryption. The HTTPS data ends at the ngrok URL and the data flows unencrypted from ngrok to `localhost`. If you require end-to-end encryption, consider a paid ngrok account. See [TLS tunnels](https://ngrok.com/docs#tls) for steps on setting up secure end-to-end tunnels.-- Because the bot callback URL is dynamic, incoming call scenarios require you to frequently update your ngrok endpoints. One way to fix this is to use a paid ngrok account which provides fixed subdomains to which you can point your bot and the platform.-- Ngrok tunnels can also be used with [Azure Service Fabric](/azure/service-fabric/service-fabric-overview). For an example of how to do this, see the [HueBot sample app](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot).-
-
+* Ngrok free accounts **don't** provide end-to-end encryption. The HTTPS data ends at the ngrok URL and the data flows unencrypted from ngrok to `localhost`. If you require end-to-end encryption, consider a paid ngrok account. See [TLS tunnels](https://ngrok.com/docs#tls) for steps on setting up secure end-to-end tunnels.
+* Because the bot callback URL is dynamic, incoming call scenarios require you to frequently update your ngrok endpoints. One way to fix this is to use a paid ngrok account which provides fixed subdomains to which you can point your bot and the platform.
+* Ngrok tunnels can also be used with [Azure Service Fabric](/azure/service-fabric/service-fabric-overview). For an example of how to do this, see the [HueBot sample app](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples/HueBot/HueBot).
platform Requirements Considerations Application Hosted Media Bots https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/calls-and-meetings/requirements-considerations-application-hosted-media-bots.md
Last updated 11/16/2018
An application-hosted media bot requires the [`Microsoft.Graph.Communications.Calls.Media` .NET library](https://www.nuget.org/packages/Microsoft.Graph.Communications.Calls.Media/) to access the audio and video media streams. The bot must be deployed on a Windows Server on-premises machine or a Windows Server guest Operating System (OS) in Azure. > [!NOTE]
+>
> * The guidance for developing messaging and Interactive Voice Response (IVR) bots does not completely apply to building application-hosted media bots. > * As the Microsoft Real-time Media Platform for bots is in developer preview, the guidance in this document is subject to change.
An application-hosted media bot requires the [`Microsoft.Graph.Communications.Ca
An application-hosted media bot requires the following: -- The bot must be developed in C# and the standard .NET Framework and deployed in Microsoft Azure. You cannot use C++ or Node.js APIs to access real-time media and .NET Core is not supported for an application-hosted media bot.
+* The bot must be developed in C# and the standard .NET Framework and deployed in Microsoft Azure. You cannot use C++ or Node.js APIs to access real-time media and .NET Core is not supported for an application-hosted media bot.
-- The bot can be hosted within one of the following Azure service environments:
- - Cloud Service.
- - Service Fabric with Virtual Machine Scale Sets (VMSS).
- - Infrastructure as a Service (IaaS) Virtual Machine (VM).
+* The bot can be hosted within one of the following Azure service environments:
+ * Cloud Service.
+ * Service Fabric with Virtual Machine Scale Sets (VMSS).
+ * Infrastructure as a Service (IaaS) Virtual Machine (VM).
-- The bot cannot be deployed as an Azure web app.
+* The bot cannot be deployed as an Azure web app.
-- The bot must be running on a recent version of the `Microsoft.Graph.Communications.Calls.Media` .NET library. The bot must use either the newest available version of the [NuGet package](https://www.nuget.org/packages/Microsoft.Graph.Communications.Calls.Media/), or a version that is not more than three months old. Older versions of the library are deprecated and do not work after a few months. Keeping the `Microsoft.Graph.Communications.Calls.Media` library up-to-date ensures the best interoperability between the bot and Microsoft Teams.
+* The bot must be running on a recent version of the `Microsoft.Graph.Communications.Calls.Media` .NET library. The bot must use either the newest available version of the [NuGet package](https://www.nuget.org/packages/Microsoft.Graph.Communications.Calls.Media/), or a version that is not more than three months old. Older versions of the library are deprecated and do not work after a few months. Keeping the `Microsoft.Graph.Communications.Calls.Media` library up-to-date ensures the best interoperability between the bot and Microsoft Teams.
The next section provides details on where real-time media calls are located.
The next section provides details on accessibility of application-hosted media b
Application-hosted media bots must be directly accessible on the internet. These bots must include the following features: -- Each VM instance hosting an application-hosted media bot in Azure must be directly accessible from the internet using an instance-level public IP address (ILPIP).
- - For obtaining and configuring an ILPIP for an Azure Cloud Service, see [instance level public IP classic overview](/azure/virtual-network/virtual-networks-instance-level-public-ip).
- - For configuring an ILPIP for a VM Scale Set, see [public IPv4 per virtual machine](/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-networking#public-ipv4-per-virtual-machine).
-- The service hosting an application-hosted media bot must also configure each VM instance with a public-facing port which maps to the specific instance.
- - For an Azure Cloud Service, this requires an instance input endpoint. For more information, see [enable communication for role instances in Azure](/azure/cloud-services/cloud-services-enable-communication-role-instances).
- - For a VM Scale Set, a NAT rule on the load balancer must be configured. For more information, see [virtual networks and virtual machines in Azure](/azure/virtual-machines/windows/network-overview).
-- Application-hosted media bots are not supported by the Bot Framework Emulator.
+* Each VM instance hosting an application-hosted media bot in Azure must be directly accessible from the internet using an instance-level public IP address (ILPIP).
+ * For obtaining and configuring an ILPIP for an Azure Cloud Service, see [instance level public IP classic overview](/azure/virtual-network/virtual-networks-instance-level-public-ip).
+ * For configuring an ILPIP for a VM Scale Set, see [public IPv4 per virtual machine](/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-networking#public-ipv4-per-virtual-machine).
+* The service hosting an application-hosted media bot must also configure each VM instance with a public-facing port which maps to the specific instance.
+ * For an Azure Cloud Service, this requires an instance input endpoint. For more information, see [enable communication for role instances in Azure](/azure/cloud-services/cloud-services-enable-communication-role-instances).
+ * For a VM Scale Set, a NAT rule on the load balancer must be configured. For more information, see [virtual networks and virtual machines in Azure](/azure/virtual-machines/windows/network-overview).
+
+* Application-hosted media bots are not supported by the Bot Framework Emulator.
The next section provides details on scalability and performance considerations of application-hosted media bots. ## Scalability and performance considerations The application-hosted media bots require the following scalability and performance considerations:-- Application-hosted media bots require more compute and network (bandwidth) capacity than messaging bots and may incur significantly higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot may be able to sustain only one or two concurrent media sessions per CPU core (if using the "raw" RGB24 or NV12 video formats).-- The Real-time Media Platform doesn't currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding/decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot may take advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.-- The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with four virtual CPUs (vCPU) is the minimum size required. Detailed information about Azure VM types is available in the [Azure documentation](/azure/virtual-machines/windows/sizes-general). +
+* Application-hosted media bots require more compute and network (bandwidth) capacity than messaging bots and may incur significantly higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot doesn't accept more simultaneous calls than it can manage. A video-enabled bot may be able to sustain only one or two concurrent media sessions per CPU core (if using the "raw" RGB24 or NV12 video formats).
+* The Real-time Media Platform doesn't currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding/decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot may take advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.
+* The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with four virtual CPUs (vCPU) is the minimum size required. Detailed information about Azure VM types is available in the [Azure documentation](/azure/virtual-machines/windows/sizes-general).
## Code sample
Application-hosted media bots samples are as follows:
## See also -- [Graph Calling SDK Documentation](https://microsoftgraph.github.io/microsoft-graph-comms-samples/docs/)-- The bots require more compute and network bandwidth capacity than messaging bots and incur significantly higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot does not accept more simultaneous calls than it can manage. A video-enabled bot can sustain only one or two concurrent media sessions per CPU core if using the raw RGB24 or NV12 video formats.-- The Real-time Media Platform does not currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding or decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot takes advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.-- The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with 4 virtual CPUs (vCPU) is the minimum size required. For more information about Azure VM types, see [Azure documentation](/azure/virtual-machines/windows/sizes-general).
+* [Graph Calling SDK Documentation](https://microsoftgraph.github.io/microsoft-graph-comms-samples/docs/)
+* The bots require more compute and network bandwidth capacity than messaging bots and incur significantly higher operational costs. A real-time media bot developer must carefully measure the bot's scalability, and ensure the bot does not accept more simultaneous calls than it can manage. A video-enabled bot can sustain only one or two concurrent media sessions per CPU core if using the raw RGB24 or NV12 video formats.
+* The Real-time Media Platform does not currently take advantage of any Graphics Processing Units (GPU) available on the VM to off-load H.264 video encoding or decoding. Instead, video encode and decode are done in software on the CPU. If a GPU is available, the bot takes advantage of it for its own graphics rendering, for example, if the bot is using a 3D graphics engine.
+* The VM instance hosting the real-time media bot must have at least 2 CPU cores. For Azure, a Dv2-series virtual machine is recommended. For other Azure VM types, a system with 4 virtual CPUs (vCPU) is the minimum size required. For more information about Azure VM types, see [Azure documentation](/azure/virtual-machines/windows/sizes-general).
The next section provides samples that illustrate different local media scenarios. ## Samples and additional resources -- [Sample applications](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples)-- [Graph calling SDK documentation](https://microsoftgraph.github.io/microsoft-graph-comms-samples/docs/)
+* [Sample applications](https://github.com/microsoftgraph/microsoft-graph-comms-samples/tree/master/Samples/V1.0Samples/LocalMediaSamples)
+* [Graph calling SDK documentation](https://microsoftgraph.github.io/microsoft-graph-comms-samples/docs/)
platform Add Power Virtual Agents Bot To Teams https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/add-power-virtual-agents-bot-to-teams.md
Power Virtual Agents lets you create powerful chatbots that can answer questions
These bots can be created easily without the need for data scientists or developers. > [!NOTE]
-> By adding your chatbot to Microsoft Teams, some of the data, such as bot content and user chat content, is shared with Microsoft Teams. It means that your data flows outside of your [organizationΓÇÖs compliance and geographic or regional boundaries](/power-virtual-agents/data-location). <br/>
+> * By adding your chatbot to Microsoft Teams, some of the data, such as bot content and user chat content, is shared with Microsoft Teams. It means that your data flows outside of your [organizationΓÇÖs compliance and geographic or regional boundaries](/power-virtual-agents/data-location). <br/>
+> * You must not use Microsoft Power Platform to create apps that are to be published to the Teams app store. Microsoft Power Platform apps can be published to an organizationΓÇÖs app store only.
## Make your chatbot available in Teams through the Power Virtual Agents portal
platform Auth Flow Bot https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/authentication/auth-flow-bot.md
for an example that demonstrates authentication flow for bots using Node.js and
In this example, the bot stores the access token in its user data store. It asks the user to sign in if it doesn't have a validated token for the selected identity provider. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/utils/AuthenticationUtils.ts#L58-L76)) 3. The bot constructs the URL to the start page of the authentication flow, and sends a card to the user with a `signin` action. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/dialogs/BaseIdentityDialog.ts#L160-L190))</br> Like other application auth flows in Teams, the start page must be in a domain that's on your `validDomains` list, and in the same domain as the post-login redirect page.
- > [!IMPORTANT]
+ > [!IMPORTANT]
> The OAuth 2.0 authorization code grant flow calls for a `state` parameter in the authentication request, which contains a unique session token to prevent a [cross-site request forgery attack](https://en.wikipedia.org/wiki/Cross-site_request_forgery). The example uses a randomly-generated GUID. 4. When the user selects the *signin* button, Teams opens a pop-up window and navigates to the start page. > [!NOTE]
for an example that demonstrates authentication flow for bots using Node.js and
7. The provider takes the user to the bot's OAuth redirect page with an authorization code. 8. The bot redeems the authorization code for an access token, and **provisionally** associates the token with the user that initiated the sign-in flow. Below, we call this a *provisional token*. * In the example, the bot associates the value of the `state` parameter with the ID of the user that initiated the sign-in process so it can later match it with the `state` value returned by the identity provider. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/AuthBot.ts#L70-L99))
- > [!IMPORTANT]
- > The bot stores the token it receives from the identity provider and associates it with a specific user, but it is marked as "pending validation".
+ > [!IMPORTANT]
+ > The bot stores the token it receives from the identity provider and associates it with a specific user, but it is marked as "pending validation".
* The provisional token can't be used without further validation.
- 1. **Validate what's received from the identity provider.** The value of the `state` parameter must be confirmed against what was saved earlier.
+ 1. **Validate what's received from the identity provider.** The value of the `state` parameter must be confirmed against what was saved earlier.
1. **Validate what's received from Teams.** A [two-step authentication](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) validation is performed to ensure that the user who authorized the bot with the identity provider is the same user who is chatting with the bot. This guards against [man-in-the-middle](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) and [phishing](https://en.wikipedia.org/wiki/Phishing) attacks. The bot generates a verification code and stores it, associated with the user. The verification code is sent automatically by Teams as described below. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/AuthBot.ts#L100-L113)) 9. The OAuth callback renders a page that calls `notifySuccess("<verification code>")`. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/master/src/views/oauth-callback-success.hbs)) 10. Teams closes the pop-up window and sends the `<verification code>` sent to `notifySuccess()` back to the bot. The bot receives an [invoke](/bot-framework/dotnet/bot-builder-dotnet-activities#invoke) message with `name = signin/verifyState`.
platform Bots Filesv4 https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/bots-filesv4.md
As a best practice, acknowledge the file upload by sending a message back to the
### Upload files to personal chat
-**To upload a file to a user**
+To upload a file to a user:
1. Send a message to the user requesting permission to write the file. This message must contain a `FileConsentCard` attachment with the name of the file to be uploaded. 2. If the user accepts the file download, the bot receives an invoke activity with a location URL.
platform Channel Messages With Rsc https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/channel-messages-with-rsc.md
For more information about enabling RSC for your app, see [resource-specific con
The `ChannelMessage.Read.Group` RSC permission is extended to bots. With user consent, this permission allows graph applications to get all messages in a conversation and bots to receive all channel messages without being @mentioned. > [!NOTE]
+>
> * Services that need access to all Teams message data must use the Graph APIs that also provide access to archived data in channels and chats. > * Bots must use the `ChannelMessage.Read.Group` RSC permission appropriately to build and enhance engaging experience for users in the team or they will not pass the store approval. The app description must include how the bot uses the data it reads.
-> * The `ChannelMessage.Read.Group` RSC permission may not be used by bots as a way to extract large amounts of customer data.
+> * The `ChannelMessage.Read.Group` RSC permission may not be used by bots as a way to extract large amounts of customer data.
## Update app manifest
The following code provides an example of RSC permissions:
// When rsc is enabled the method will be called even when bot is addressed without being @mentioned protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) {
- await turnContext.SendActivityAsync(MessageFactory.Text("Using RSC the bot can recieve messages across channels in team without being @mentioned."));
+ await turnContext.SendActivityAsync(MessageFactory.Text("Using RSC the bot can recieve messages across channels in team without being @mentioned."));
} ```
this.onMessage(async (context, next) => {
| Sample name | Description | C# |Node.js| |-|-||-|
-|Channel messages with RSC permissions| Microsoft Teams sample app demonstrating on how a bot can receive all channel messages with RSC without being @mentioned.| [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-receive-channel-messages-withRSC/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-receive-channel-messages-withRSC/nodejs) |
+|Channel messages with RSC permissions| Microsoft Teams sample app demonstrating on how a bot can receive all channel messages with RSC without being @mentioned.| [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-receive-channel-messages-withRSC/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-receive-channel-messages-withRSC/nodejs) |
## See also
platform Subscribe To Conversation Events https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/conversations/subscribe-to-conversation-events.md
When building your conversational bots for Microsoft Teams, you can work with co
You can use conversation update events to provide better notifications and more effective bot actions. > [!IMPORTANT]
+>
> * You can add new events any time and your bot begins to receive them. > * You must design your bot to receive unexpected events. > * If you are using the Bot Framework SDK, your bot automatically responds with a `200 - OK` to any events you choose not to handle.
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_channel_created(
- self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
+ self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(
- f"The new channel is {channel_info.name}. The channel id is {channel_info.id}"
- )
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(
+ f"The new channel is {channel_info.name}. The channel id is {channel_info.id}"
+ )
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_channel_renamed(
- self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
+ self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(f"The new channel name is {channel_info.name}")
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(f"The new channel name is {channel_info.name}")
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_channel_deleted(
- self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
+ self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(f"The deleted channel is {channel_info.name}")
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(f"The deleted channel is {channel_info.name}")
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_channel_restored(
- self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
+ self, channel_info: ChannelInfo, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(
- f"The restored channel is {channel_info.name}. The channel id is {channel_info.id}"
- )
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(
+ f"The restored channel is {channel_info.name}. The channel id is {channel_info.id}"
+ )
+ )
```
This is the message your bot receives when the bot is added to a one-to-one chat
```python async def on_teams_members_added(
- self, teams_members_added: [TeamsChannelAccount], turn_context: TurnContext
+ self, teams_members_added: [TeamsChannelAccount], turn_context: TurnContext
):
- for member in teams_members_added:
- await turn_context.send_activity(
- MessageFactory.text(f"Welcome your new team member {member.id}")
- )
- return
+ for member in teams_members_added:
+ await turn_context.send_activity(
+ MessageFactory.text(f"Welcome your new team member {member.id}")
+ )
+ return
```
The `channelData` object in the following payload example is based on adding a m
```python async def on_teams_members_removed(
- self, teams_members_removed: [TeamsChannelAccount], turn_context: TurnContext
+ self, teams_members_removed: [TeamsChannelAccount], turn_context: TurnContext
):
- for member in teams_members_removed:
- await turn_context.send_activity(
- MessageFactory.text(f"Say goodbye to {member.id}")
- )
- return
+ for member in teams_members_removed:
+ await turn_context.send_activity(
+ MessageFactory.text(f"Say goodbye to {member.id}")
+ )
+ return
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_team_renamed(
- self, team_info: TeamInfo, turn_context: TurnContext
+ self, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(f"The new team name is {team_info.name}")
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(f"The new team name is {team_info.name}")
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_team_deleted(
- self, team_info: TeamInfo, turn_context: TurnContext
+ self, team_info: TeamInfo, turn_context: TurnContext
):
- //handle delete event
- )
+ //handle delete event
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_team_restored(
- self, team_info: TeamInfo, turn_context: TurnContext
+ self, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(f"The team name is {team_info.name}")
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(f"The team name is {team_info.name}")
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_team_archived(
- self, team_info: TeamInfo, turn_context: TurnContext
+ self, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(f"The team name is {team_info.name}")
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(f"The team name is {team_info.name}")
+ )
``` - ### Team unarchived The bot receives a notification when the team is installed and unarchived. It receives a `conversationUpdate` event with `eventType.teamUnarchived` in the `channelData` object.
export class MyBot extends TeamsActivityHandler {
```python async def on_teams_team_unarchived(
- self, team_info: TeamInfo, turn_context: TurnContext
+ self, team_info: TeamInfo, turn_context: TurnContext
):
- return await turn_context.send_activity(
- MessageFactory.text(f"The team name is {team_info.name}")
- )
+ return await turn_context.send_activity(
+ MessageFactory.text(f"The team name is {team_info.name}")
+ )
```
export class MyBot extends TeamsActivityHandler {
```python async def on_reactions_added(
- self, message_reactions: List[MessageReaction], turn_context: TurnContext
+ self, message_reactions: List[MessageReaction], turn_context: TurnContext
):
- for reaction in message_reactions:
- activity = await self._log.find(turn_context.activity.reply_to_id)
- if not activity:
- await self._send_message_and_log_activity_id(
- turn_context,
- f"Activity {turn_context.activity.reply_to_id} not found in log",
- )
- else:
- await self._send_message_and_log_activity_id(
- turn_context,
- f"You added '{reaction.type}' regarding '{activity.text}'",
- )
- return
+ for reaction in message_reactions:
+ activity = await self._log.find(turn_context.activity.reply_to_id)
+ if not activity:
+ await self._send_message_and_log_activity_id(
+ turn_context,
+ f"Activity {turn_context.activity.reply_to_id} not found in log",
+ )
+ else:
+ await self._send_message_and_log_activity_id(
+ turn_context,
+ f"You added '{reaction.type}' regarding '{activity.text}'",
+ )
+ return
```
export class MyBot extends TeamsActivityHandler {
```python async def on_reactions_removed(
- self, message_reactions: List[MessageReaction], turn_context: TurnContext
+ self, message_reactions: List[MessageReaction], turn_context: TurnContext
):
- for reaction in message_reactions:
- activity = await self._log.find(turn_context.activity.reply_to_id)
- if not activity:
- await self._send_message_and_log_activity_id(
- turn_context,
- f"Activity {turn_context.activity.reply_to_id} not found in log",
- )
- else:
- await self._send_message_and_log_activity_id(
- turn_context,
- f"You removed '{reaction.type}' regarding '{activity.text}'",
- )
- return
+ for reaction in message_reactions:
+ activity = await self._log.find(turn_context.activity.reply_to_id)
+ if not activity:
+ await self._send_message_and_log_activity_id(
+ turn_context,
+ f"Activity {turn_context.activity.reply_to_id} not found in log",
+ )
+ else:
+ await self._send_message_and_log_activity_id(
+ turn_context,
+ f"You removed '{reaction.type}' regarding '{activity.text}'",
+ )
+ return
```
async def on_reactions_removed(
## Installation update event The bot receives an `installationUpdate` event when you install a bot to a conversation thread. Uninstallation of the bot from the thread also triggers the event. On installing a bot, the **action** field in the event is set to *add*, and when the bot is uninstalled the **action** field is set to *remove*.
-
+ > [!NOTE] > When you upgrade an application, and then add or remove a bot, the action also triggers the `installationUpdate` event. The **action** field is set to *add-upgrade* if you add a bot or *remove-upgrade* if you remove a bot.
platform Locally With An Ide https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/debug/locally-with-an-ide.md
You can also initiate a conversation with your bot by using its ID. When a bot h
Alternatively, you can paste your bot's app ID in the search box in the top left in Microsoft Teams. In the search results page, navigate to the **People** tab to see your bot and to start chatting with it. > [!Note]
-> For Microsoft Teams to refer to your bot's app ID, enable [sideloading of apps](/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant#enable-custom-teams-apps-and-turn-on-custom-app-uploading).
+> For Microsoft Teams to refer to your bot's app ID, enable [sideloading of apps](/microsoftteams/platform/concepts/build-and-test/prepare-your-o365-tenant#enable-custom-teams-apps-and-turn-on-custom-app-uploading).
Your bot receives the `conversationUpdate` event as you add the bots to a team, without the team information in the `channelData` object.
platform Rate Limit https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/rate-limit.md
You can also handle rate limit using the per bot per thread limit.
The per bot per thread limit controls the traffic that a bot is allowed to generate in a single conversation. A conversation is 1:1 between bot and user, a group chat, or a channel in a team. So, if the application sends one bot message to each user, the thread limit does not throttle. >[!NOTE]
-> * The thread limit of 3600 seconds and 1800 operations applies only if multiple bot messages are sent to a single user.
+>
+> * The thread limit of 3600 seconds and 1800 operations applies only if multiple bot messages are sent to a single user.
> * The global limit per app per tenant is 50 Requests Per Second (RPS). Hence, the total number of bot messages per second must not cross the thread limit. > * Message splitting at the service level results in higher than expected RPS. If you are concerned about approaching the limits, you must implement the [backoff strategy](#backoff-example). The values provided in this section are for estimation only.
platform Update And Delete Bot Messages https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/bots/how-to/update-and-delete-bot-messages.md
update_result = await context.update_activity(new_activity)
# [REST API](#tab/rest) > [!NOTE]- > You can develop Teams apps in any web-programming technology and directly call the [Bot Connector service REST APIs](/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0&preserve-view=true). To do so, you need to implement [Authentication](/azure/bot-service/rest-api/bot-framework-rest-connector-authentication?view=azure-bot-service-4.0&preserve-view=true) security procedures with your API requests. To update an existing activity within a conversation, include the `conversationId` and `activityId` in the request endpoint. To complete this scenario, you must cache the activity ID returned by the original post call.
PUT /v3/conversations/{conversationId}/activities/{activityId}
| An [Activity](/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#activity-object&preserve-view=true) object. | A [ResourceResponse](/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#resourceresponse-object&preserve-view=true) object. |
-* * *
+ Now that you have updated messages, update the existing card on button selection for incoming activities.
PUT /v3/conversations/{conversationId}/activities/{activityId}
|-|-| | An [activity](/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#activity-object&preserve-view=true) object. | A [ResourceResponse](/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#resourceresponse-object&preserve-view=true) object. |
-* * *
+ Now that you have updated cards, you can delete messages using the Bot Framework.
platform Configure Identity Provider https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/authentication/configure-identity-provider.md
Replace `<hostname>` with your actual host, which might be a dedicated hosting s
* **External OAuth providers from tabs:** For more information, see [Use external OAuth providers](../../tabs/how-to/authentication/auth-oauth-provider.md)
-## See also
+## See also
* [Authenticate a user in a Microsoft Teams bot](../../resources/bot-v3/bot-authentication/auth-bot-AAD.md) * [Single sign-on (SSO) support for tabs](../../tabs/how-to/authentication/auth-aad-sso.md)
-* [Authenticate a user in a Microsoft Teams tab](../../tabs/how-to/authentication/auth-tab-aad.md)
+* [Authenticate a user in a Microsoft Teams tab](../../tabs/how-to/authentication/auth-tab-aad.md)
platform Apps Localization https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/apps-localization.md
Last updated 05/15/2018
Consider the following factors to localize your Microsoft Teams app: 1. [Localize your AppSource listing](#localize-your-appsource-listing).
-1. [Localize strings in your app manifest](#localize-strings-in-your-app-manifest).
+1. [Localize strings in your app manifest](#localize-strings-in-your-app-manifest).
1. [Handle localized text submissions from your users](#handle-localized-text-submissions-from-your-users). ## Localize your AppSource listing
The images that you upload with the English language are used in AppSource.
## Localize strings in your app manifest
-You must use the Microsoft Teams app schema `v1.5` and later to localize your app. You can do this by setting the `$schema` attribute in your manifest.json file to **https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json** or higher and updating the `manifestVersion` property to `$schema` version (`1.5` in this case).
+You must use the Microsoft Teams app schema `v1.5` and later to localize your app. You can do this by setting the `$schema` attribute in your manifest.json file to **https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json** or higher and updating the `manifestVersion` property to `$schema` version (`1.5` in this case).
You must add the `localizationInfo` property with the default language that your application supports. The default language is used as the final fallback language if the user's client settings do not match with any of your additional languages.
The following manifest.json helps to add the `localizationInfo` property with th
"$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.5/MicrosoftTeams.schema.json", "manifestVersion": "1.5", "localizationInfo": {
- "defaultLanguageTag": "en",
- "additionalLanguages": [
- {
- "languageTag": "es-mx",
- "file": "es-mx.json"
- }
- ]
- }
+ "defaultLanguageTag": "en",
+ "additionalLanguages": [
+ {
+ "languageTag": "es-mx",
+ "file": "es-mx.json"
+ }
+ ]
+ }
... } ```
Following is an example for localization .json:
} ``` - You can provide additional .json files with translations of all the user facing strings in your manifest. These files must adhere to the [Localization file JSON schema](../../resources/schem) and they must be added to the `localizationInfo` property of your manifest. Each file correlates to a language tag, which the Teams client uses to select the appropriate strings. The language tag takes the form of `<language>-<region>` but you can omit the `<region>` portion to target all regions that support the desired language. The Teams client applies the strings in the following order:
For example, you provide a default language of 'fr' (French, all regions), and a
1. The Teams client takes the 'fr' strings and overwrite them with the 'en' strings. 1. Overwrite the 'en' strings with the 'en-gb' strings.
-If the user's language is set to 'en-ca', the following changes take place based on the language selection:
+If the user's language is set to 'en-ca', the following changes take place based on the language selection:
1. The Teams client takes the 'fr' strings and overwrite them with the 'en' strings. 1. Since no 'en-ca' localization is supplied, the 'en` localizations are used. If the user's language is set to 'es-es', the Teams client takes the 'fr' strings. The Teams client does not override the strings with any of the language files as no 'es' or 'es-es' translation is provided.
-Therefore, you must provide top level, language only translations in your manifest. For example, 'en' instead of 'en-us'. You must provide region level overrides only for the few strings that need them.
+Therefore, you must provide top level, language only translations in your manifest. For example, 'en' instead of 'en-us'. You must provide region level overrides only for the few strings that need them.
### Example manifest.json change
platform Test App Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/test-app-overview.md
Before you start testing your app, prepare your Microsoft 365 test tenant and en
To test and debug your app, you must create at least one workspace. You can select a test setup, such as local host or cloud-based host to test and debug the app. Guidance to debug your Teams app is provided to load and run your app experience. For more information, see [choose a set up and run your Microsoft Teams app](~/concepts/build-and-test/debug.md).
-Test your bot locally. For more information, see [debug your bot locally with an IDE](~/bots/how-to/debug/locally-with-an-ide.md). You can also debug your bot with [inspection middleware](/azure/bot-service/bot-service-debug-inspection-middleware?view=azure-bot-service-4.0&tabs=csharp&preserve-view=true) and [adaptive tools](/azure/bot-service/bot-service-debug-adaptive-tools?view=azure-bot-service-4.0&preserve-view=true).
+Test your bot locally. For more information, see [debug your bot locally with an IDE](~/bots/how-to/debug/locally-with-an-ide.md). You can also debug your bot with [inspection middleware](/azure/bot-service/bot-service-debug-inspection-middleware?view=azure-bot-service-4.0&tabs=csharp&preserve-view=true) and [adaptive tools](/azure/bot-service/bot-service-debug-adaptive-tools?view=azure-bot-service-4.0&preserve-view=true).
-To view the console logs, view or modify html, css, and network requests during runtime, add breakpoints to your JavaScript code, and perform interactive debugging access the DevTools. For more information, see [Access the DevTools for Teams tabs](~/tabs/how-to/developer-tools.md).
+To view the console logs, view or modify html, css, and network requests during runtime, add breakpoints to your JavaScript code, and perform interactive debugging access the DevTools. For more information, see [Access the DevTools for Teams tabs](~/tabs/how-to/developer-tools.md).
## Add test data to your Microsoft 365 tenant
platform Test Data https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/build-and-test/test-data.md
By default, only global admins or Teams service admins can upload (sideload) app
## See also
-* [Debug your tab](~/tabs/how-to/developer-tools.md)
+* [Debug your tab](~/tabs/how-to/developer-tools.md)
* [Debug your bots](~/bots/how-to/debug/locally-with-an-ide.md) * [Test RSC permissions](~/graph-api/rsc/test-resource-specific-consent.md)
platform Add Default Install Scope https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/add-default-install-scope.md
If your app's primary capability is a bot, you can also make the bot the default
Configure the default install scope for your app. You can set only one scope at a time.
-**To configure the default install scope in your app manifest**
+To configure the default install scope in your app manifest:
1. Open your app manifest and add the `defaultInstallScope` property. 2. Set default install scope value as, either `personal`, `team`, `groupchat`, or `meetings`.
Configure the default capability when your app is installed for a team, meeting,
> [!NOTE] > `defaultGroupCapability` provides the default capability that will be added to the team, groupchat, or meeting. Select a tab, bot, or connector as the default capability for your app, but you must ensure that you have provided the selected capability in your app definition.
-**To configure details in app manifest**
+To configure details in app manifest:
1. Open your app manifest and add the `defaultGroupCapability` property to it. 2. Set a value of `team`, `groupchat`, or `meetings`.
-3. For the selected group capability, the available group capabilities are, `bot`, `tab`, or `connector`.
+3. For the selected group capability, the available group capabilities are, `bot`, `tab`, or `connector`.
> [!NOTE] > You can select only one default capability, `bot`, `tab`, or `connector` for the selected group capability.
platform Apps Upload https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/apps-upload.md
ms.localizationpriority: high
# Upload your app in Microsoft Teams
-You can sideload Microsoft Teams apps without having to publish to your organization or the Teams store. This makes sense in the following scenarios:
+You can sideload Microsoft Teams apps without having to publish to your organization or the Teams store in the following scenarios:
* You want to test and debug an app locally yourself or with other developers.
-* You built an app just for yourself. For example, to automate a workflow.
+* You built an app for yourself to automate a workflow.
* You built an app for a small set of users, such as, your work group. > [!IMPORTANT]
You can sideload Microsoft Teams apps without having to publish to your organiza
## Prerequisites
-* Create your [app package](~/concepts/build-and-test/apps-package.md) and [validate it](https://dev.teams.microsoft.com/appvalidation.html) for errors.
+* Ensure to create your [app package](~/concepts/build-and-test/apps-package.md) and [validate it](https://dev.teams.microsoft.com/appvalidation.html) for errors.
* [Enable custom app uploading](~/concepts/build-and-test/prepare-your-o365-tenant.md#enable-custom-teams-apps-and-turn-on-custom-app-uploading) in Teams.
-* Make sure that your app is running and accessible via HTTPs.
+* Ensure that your app is running and accessible using HTTPs.
## Upload your app You can sideload your app to a team, chat, meeting, or for personal use depending on how you configured your app's scope. 1. Log in to the Teams client with your [Microsoft 365 development account](~/build-your-first-app/build-and-run.md#prerequisites).
-1. Select **Apps** and choose **Upload a custom app**.
-1. Select your app package .zip file. An install dialog displays.
-1. Add your app to Teams.
+1. Select **Apps** and select **Manage your apps**.
+1. Select **Upload a custom app**.
+1. Select your app package .zip file, the following screen appears:
-> [!NOTE]
-> `onInstallationUpdateActivityAsync()` method is used to get Microsoft Teams Locale while adding the bot to Microsoft Teams.
+ :::image type="content" source="~/assets/images/build-your-first-app/add-teams-app.png" alt-text="Screenshot showing an example of a Teams app install dialog.":::
+
+1. Select **Add** to add your app to Teams.
+
+ > [!NOTE]
+ > `onInstallationUpdateActivityAsync()` method is used to get Microsoft Teams Locale while adding the bot to Microsoft Teams.
-## Troubleshoot upload issues
+## Troubleshooting
-If your app fails to sideload, do the following until the issue resolves:
+If your app fails to sideload or any issues to upload, check the following options:
-1. Go back through the instructions for [creating your app package](../../concepts/build-and-test/apps-package.md).
-1. [Validate your app package](https://dev.teams.microsoft.com/appvalidation.html) again.
-1. Ensure your app manifest matches the latest [schema](../../resources/schem).
+1. Ensure that you have followed all the instructions for [creating your app package](../../concepts/build-and-test/apps-package.md).
+1. [Validate your app package](https://dev.teams.microsoft.com/appvalidation.html).
+1. Ensure your app manifest matches to the latest [schema](../../resources/schem).
## Access your app
platform Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/post-publish/overview.md
Data for newly published apps takes about a week to appear in the report.
> [!NOTE] > Teams store has evolved:
->
+>
> Previously, the links were copied by selecting ellipses on the app tile. With the updated Teams store experience, you will access the same from the details tab of the apps. This update will be generally available (GA) by March 01, 2022. You can submit changes to your app (such as new features or even metadata) in Partner Center. These changes requires a new review process.
platform Create Partner Center Dev Account https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/create-partner-center-dev-account.md
Send an email to <a href="mailto:teamsubm@microsoft.com">teamsubm@microsoft.com<
* **Subject Line**: Partner Center Account Issue for *your app name*. * **Email body**:
- * Support ticket number.
- * Your seller ID.
- * A screenshot of the issue (if possible).
+ * Support ticket number.
+ * Your seller ID.
+ * A screenshot of the issue (if possible).
<br>
platform Include Saas Offer https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md
With a transactable Software-as-a-Service (SaaS) offer, you can monetize your Te
Here's a general idea of how to monetize your app:
-1. [Plan your SaaS offer](#plan-your-saas-offer).
+1. [Plan your SaaS offer](#plan-your-saas-offer).
-1. [Integrate with the SaaS Fulfillment APIs](#integrate-with-the-saas-fulfillment-apis).
+1. [Integrate with the SaaS Fulfillment APIs](#integrate-with-the-saas-fulfillment-apis).
-1. [Build a landing page for subscription management](#build-a-landing-page-for-subscription-management).
+1. [Build a landing page for subscription management](#build-a-landing-page-for-subscription-management).
-1. [Create your SaaS offer](#create-your-saas-offer).
+1. [Create your SaaS offer](#create-your-saas-offer).
-1. [Configure your app for the SaaS offer](#configure-your-app-for-the-saas-offer).
+1. [Configure your app for the SaaS offer](#configure-your-app-for-the-saas-offer).
-1. [Publish your app to the Teams store](#publish-your-app).
+1. [Publish your app to the Teams store](#publish-your-app).
:::column-end::: :::column span="1":::
-
+ :::image type="content" source="~/assets/images/saas-offer/saas-offer-diagram.png" alt-text="Diagram showing process for how to include a SaaS offer with your Teams app." border="false"::: :::column-end:::
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.
-## Build a landing page for subscription management
+## 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).
Once youΓÇÖve integrated the SaaS Fulfillment APIs and built your landing page w
See [create a SaaS offer](/azure/marketplace/create-new-saas-offer) for complete instructions on how to do this in Partner Center. The following steps describe what to do at a high level.
-1. Create a [Partner Center](https://partner.microsoft.com/) account if you donΓÇÖt have one.
+1. Create a [Partner Center](https://partner.microsoft.com/) account if you donΓÇÖt have one.
-1. Configure the subscription plans, pricing details, and more for your transactable SaaS offer. In particular, make sure you complete the following steps:
+1. Configure the subscription plans, pricing details, and more for your transactable SaaS offer. In particular, make sure you complete the following steps:
* Under **Setup details**, select the **Yes** option to specify that youΓÇÖre selling the offer through Microsoft.
-
+ * Under **Microsoft 365 integration**, add the AppSource link to your app listing. This step ensures people can buy your subscription plans in AppSource in addition to Teams. 1. Store your publisher and offer IDs. (You need them later to link the offer to your app in the Developer Portal.)
platform Monetize Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/monetize-overview.md
Microsoft Teams app Store provide features that enable you to monetize your apps
:::column-end::: :::column span="2":::
-**Include a SaaS offer with your app**
+Include a SaaS offer with your app:
With a transactable [Software-as-a-Service (SaaS) offer](~/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md), you can monetize your Teams app by selling subscription plans directly from your Teams store listing.
With a transactable [Software-as-a-Service (SaaS) offer](~/concepts/deploy-and-p
:::column-end::: :::column span="2":::
-**Free trials**
+Free trials:
You can offer a free trial version of your app to get more customers to try it. To entice customers to buy the full version, you can limit the features in the trial version (for example, only including limited number of responses for a week) or specify a time period for the trial.
Whether you charge a price for your app or offer it for free, you can use in-app
:::column-end::: :::column span="2":::
-**Test preview for monetized app**
+Test preview for monetized app:
With a transactable Software as a Service (SaaS) offer, you can test the end-to-end purchase experience for your monetized apps in Teams before you publish.
With a transactable Software as a Service (SaaS) offer, you can test the end-to-
:::column-end::: :::row-end:::+ ## Next step
-[Include a SaaS offer with your Microsoft Teams app](~/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md)
+[Include a SaaS offer with your Microsoft Teams app](~/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md)
platform Map Use Cases https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/design/map-use-cases.md
A well-defined use case helps you to chart out the framework of features you wan
You can map your use case based on: -- Sharing and collaborating on items in an external system.-- Starting workflows and sending notifications to users.-- Using social platforms, conversational bots, and combining multiple features.
+* Sharing and collaborating on items in an external system.
+* Starting workflows and sending notifications to users.
+* Using social platforms, conversational bots, and combining multiple features.
## Common use cases mapped to Teams capabilities
Let's look at how Teams capabilities enable different features for your app.
For example: -- Use the **tab** capability to display task modules, request device permissions, display <`iframe`> content, or using deep links.-- Use the **messaging extension** capability to send cards, unfurl links, or take action on messages.
+* Use the **tab** capability to display task modules, request device permissions, display <`iframe`> content, or using deep links.
+* Use the **messaging extension** capability to send cards, unfurl links, or take action on messages.
## See also -- [Planning checklist](../design/planning-checklist.md)-- [Build your first Microsoft Teams app](../../get-started/get-started-overview.md)
+* [Planning checklist](../design/planning-checklist.md)
+* [Build your first Microsoft Teams app](../../get-started/get-started-overview.md)
platform Plan Responsive Tabs For Teams Mobile https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/design/plan-responsive-tabs-for-teams-mobile.md
The following list provides the key information to plan building apps for Teams
* Consider cross-device functionality of Teams app. For example, if you've a well performing app on desktop, you can explore to build similar app on mobile. Initially, it can be difficult to shift entire desktop experience on mobile. You can start with basic but common scenarios. Add functionalities and capabilities after you gather more insight and user feedback.
-* Ensure to target appropriate user persona on mobile. For example, if you're building an app that provides service to end users, and also provides data access to developers and senior managers, then the end users can use the app more while you start to build app on Teams mobile. You can cater to all the personas that you have on your desktop app however, it's recommended to start with persona with a larger base and possible early adopters for smaller screen experience. As per the example, the end users are the appropriate user personas. You can gradually add functionalities to support other user personas on your Teams mobile.
+* Ensure to target appropriate user persona on mobile. For example, if you're building an app that provides service to end users, and also provides data access to developers and senior managers, then the end users can use the app more while you start to build app on Teams mobile. You can cater to all the personas that you have on your desktop app however, it's recommended to start with persona with a larger base and possible early adopters for smaller screen experience. As per the example, the end users are the appropriate user personas. You can gradually add functionalities to support other user personas on your Teams mobile.
## Understand different stages to build apps
Let us go through the following use cases to understand how to plan different ty
You can understand how to plan responsive tabs for dashboarding and data visualization apps on Teams mobile platform.
-**Consumption**
+Consumption:
In the first stage, you can implement the most basic consumption experience, to view data. The purpose of any app in the domain is to show data in the form of visualizations. In your app, you can show recently viewed visualizations on desktop, or list of all authorized charts for the users. After creating dashboards on desktop, users can access the information using mobile. You can show a detailed view of any chart selected by user as an expanded view in your tabs or by using task modules.
-You can show the following information:
+You can show the following information:
* Dashboards and summaries * Data visuals, maps, and infographics
-* Charts, graphs, and tables
+* Charts, graphs, and tables
![Dashboarding and data visualization apps consumption](../../assets/images/app-fundamentals/dashboarding-and-data-visualization-apps-consumption.png)
-**Quick actions**
+Quick actions:
In the second stage, the users can work on the existing charts and visuals from desktop experience. You can introduce the following actions:
In the second stage, the users can work on the existing charts and visuals from
![Dashboarding and data visualization apps quick actions](../../assets/images/app-fundamentals/dashboarding-and-data-visualization-apps-quick-actions.png)
-**Enablement**
+Enablement:
In the third stage, enable users to create content such as, charts and graphics from scratch. Ensure to introduce all the capabilities in your app for mobile. For example, you can use task modules to help access specific data items with detailed view. You can provide following access to users:+ * Modify title and description * Insert data items to create visualizations * Share visualizations in a channel or group chat ![Dashboarding and data visualization apps enablement](../../assets/images/app-fundamentals/dashboarding-and-data-visualization-apps-enablement.png) - <br> </details>
You can provide following access to users:
You can understand how to plan responsive tabs for task boarding apps on Teams mobile platform.
-**Consumption**
+Consumption:
In the first stage, your app can show the list of tasks to the user in a vertical stack. If there are multiple categories of tasks, such as **Proposed**, **Active**, and **Closed** then provide filters for showing grouped tasks or as headers to see the grouped tasks. ![Task boarding apps consumption](../../assets/images/app-fundamentals/taskboarding-apps-consumption.png)
-**Quick actions**
+Quick actions:
In the second stage, you can provide the following app access to users:+ * Create tasks or items with the mandatory fields to reduce cognitive load of the users * Change the board type or view * Review tasks by expanding the view * Use task modules to see detailed view
-* Move the tasks into different categories
+* Move the tasks into different categories
* Share relevant tasks in chats and channels through emails and activity feed ![Task boarding apps quick actions](../../assets/images/app-fundamentals/taskboarding-apps-quick-actions.png)
-**Enablement**
+Enablement:
In the third stage, you can enable users' experience with the following activities:+ * Add new projects and boards * Add and modify different categories, such as **Proposed**, **Active**, and **Closed** * Configure the tasks for comments, attachments, and other complex features
In the third stage, you can enable users' experience with the following activiti
You can understand how to plan responsive tabs for coauthoring and whiteboarding apps on Teams mobile platform.
-**Consumption**
+Consumption:
In the first stage, you can consider desktop experience to show the content and assets in your app. You can show the following functions:
In the first stage, you can consider desktop experience to show the content and
![Coauthoring and whiteboarding apps consumption](../../assets/images/app-fundamentals/coauthoring-and-whiteboarding-apps-consumption.png)
-**Quick Actions**
+Quick Actions:
In the second stage, you can introduce the following actions:
In the second stage, you can introduce the following actions:
![Coauthoring and whiteboarding apps quick actions](../../assets/images/app-fundamentals/coauthoring-and-whiteboarding-apps-quick-actions.png)
-**Enablement**
+Enablement:
In the third stage, provide complete experience to your users. You can enable users' experience with the following activities:
platform Browser Device Permissions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/browser-device-permissions.md
# Device permissions for the browser > [!NOTE]
-> The latest update on how device permissions are handled in the browser is currently available in [public developer preview](../../resources/dev-preview/developer-preview-intro.md) only.
+> The latest update on how device permissions are handled in the browser is currently available in [public developer preview](../../resources/dev-preview/developer-preview-intro.md) only.
> This update will be generally available (GA) starting February 01, 2022 and finish rolling out late February. - Teams app that require device permissions, such as camera or microphone access, now require users to manually grant permission at a per app level in the web browser. Previously, the browser handled how to grant access permissions, but now these permissions are handled in Microsoft Teams. This has implications on how you design your application and if they require these permissions in the browser. ## Enable app's device permissions
-If your Teams app has declared in the [application manifest](native-device-permissions.md#specify-permissions) that it needs device permissions, then the **App permissions** option appears for the users to enable the app's device permissions. The **App permissions** option is available in the following capabilities:
+
+If your Teams app has declared in the [application manifest](native-device-permissions.md#specify-permissions) that it needs device permissions, then the **App permissions** option appears for the users to enable the app's device permissions. The **App permissions** option is available in the following capabilities:
* **Personal apps and task module dialogs**: The **App permissions** option is available in the upper-right corner of the page. <img src="../../assets/images/tabs/apppermissions.png" alt="App permissions button" width="800"/>
A user will need to enable these permissions in the browser for these permission
> You must make users aware of where to go to enable these **App permissions** in Microsoft Teams. ## Recommendation+ Teams app that require device permissions in the browser must show instructions to users on where to find and enable these permissions in the Teams UI. Depending on the context in which your application is running, you need to ensure that your instructions are pointing the user to correct location to access these permissions, as they differ for personal apps, task module dialogs, tabs in chats, and channels or meetings. </br>
platform Device Capabilities Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/device-capabilities-overview.md
Device permissions are different in the browser. Previously, browser handled how
## Native device capabilities A mobile or desktop has built-in devices, such as camera and microphone, called capabilities. You can access the following device capabilities on mobile or desktop through dedicated APIs available in [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true):+ * Media capabilities, such as
- * Camera
- * Microphone
- * Gallery
- * QR or barcode scanner
+ * Camera
+ * Microphone
+ * Gallery
+ * QR or barcode scanner
* Location
-After getting access to the device capabilities, you can integrate them with the Teams platform to enhance the collaborative experience.
+After getting access to the device capabilities, you can integrate them with the Teams platform to enhance the collaborative experience.
## Request device permissions Use the tools present in [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true) to request the required [permissions](native-device-permissions.md) for accessing the native device capabilities. While access to these capabilities is standard in modern web browsers, you must inform Teams about the capabilities that you are using by updating your app manifest. This update allows you to request permissions while your app runs on Teams mobile or desktop clients.
-
- ## Integrate device capabilities
+
+## Integrate device capabilities
After getting access to device capabilities, use Teams media capability APIs to [integrate media capabilities](mobile-camera-image-permissions.md) with the Teams platform to enhance the user experience. These integrated capabilities allow your app to:
platform Location Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/location-capability.md
You can integrate the location capabilities of native device with your Teams app.
-You can use [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true), which provides the tools necessary for your app to access the userΓÇÖs [native device capabilities](native-device-permissions.md). Use the location APIs, such as [getLocation](/javascript/api/@microsoft/teams-js/microsoftteams.location?view=msteams-client-js-latest#getLocation_LocationProps___error__SdkError__location__Location_____void_&preserve-view=true) and [showLocation](/javascript/api/@microsoft/teams-js/microsoftteams.location?view=msteams-client-js-latest#showLocation_Location___error__SdkError__status__boolean_____void_&preserve-view=true) to integrate the capabilities within your app.
+You can use [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true), which provides the tools necessary for your app to access the userΓÇÖs [native device capabilities](native-device-permissions.md). Use the location APIs, such as [getLocation](/javascript/api/@microsoft/teams-js/microsoftteams.location?view=msteams-client-js-latest#getLocation_LocationProps___error__SdkError__location__Location_____void_&preserve-view=true) and [showLocation](/javascript/api/@microsoft/teams-js/microsoftteams.location?view=msteams-client-js-latest#showLocation_Location___error__SdkError__status__boolean_____void_&preserve-view=true) to integrate the capabilities within your app.
## Advantages of integrating location capabilities
-The main advantage of integrating location capabilities in your Teams apps is that it allows web app developers on Teams platform to leverage location functionality with Microsoft Teams JavaScript client SDK.
+The main advantage of integrating location capabilities in your Teams apps is that it allows web app developers on Teams platform to leverage location functionality with Microsoft Teams JavaScript client SDK.
Following examples show how the integration of location capabilities is used in different scenarios:+ * In a factory, the supervisor can track the attendance of workers by asking them to take a selfie in the vicinity of the factory and share it through the specified app. The location data also gets captured and sent along with the image. * The location capabilities enables the maintenance staff of a service provider to share authentic health data of cellular towers with the management. The management can compare any mismatch between captured location information and the data submitted by maintenance staff.
-To integrate location capabilities, you must update the app manifest file and call the APIs. For effective integration, you must have a good understanding of [code snippets](#code-snippets) for calling the location APIs.
+To integrate location capabilities, you must update the app manifest file and call the APIs. For effective integration, you must have a good understanding of [code snippets](#code-snippets) for calling the location APIs.
It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
-> [!NOTE]
+> [!NOTE]
> Currently, Microsoft Teams support for location capabilities is available for mobile clients only. ## Update manifest
Update your Teams app [manifest.json](../../resources/schem#
``` > [!NOTE]
-> * The **Request Permissions** prompt is automatically displayed when a relevant Teams API is initiated. For more information, see [request device permissions](native-device-permissions.md).
-> * Device permissions are different in the browser. For more information, see [browser device permissions](browser-device-permissions.md).
+>
+> * The **Request Permissions** prompt is automatically displayed when a relevant Teams API is initiated. For more information, see [request device permissions](native-device-permissions.md).
+> * Device permissions are different in the browser. For more information, see [browser device permissions](browser-device-permissions.md).
## Location APIs
microsoftTeams.location.showLocation(location, (err: microsoftTeams.SdkError, re
## Error handling
-You must ensure to handle these errors appropriately in your Teams app. The following table lists the error codes and the conditions under which the errors are generated:
+You must ensure to handle these errors appropriately in your Teams app. The following table lists the error codes and the conditions under which the errors are generated:
|Error code | Error name | Condition| | | | -- |
You must ensure to handle these errors appropriately in your Teams app. The foll
### Code sample
-|Sample name | Description | C# | Node.js |
+|Sample name | Description | C# | Node.js |
|-|--|--|--| | App check-in current location | Users can check-in the current location and view all the previous location check-ins.| [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-checkin-location/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-checkin-location/nodejs) |
platform Mobile Camera Image Permissions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/mobile-camera-image-permissions.md
You can integrate native device capabilities, such as the **camera** and **micro
## Advantage of integrating media capabilities The main advantage of integrating device capabilities in your Teams apps is it leverages native Teams controls to provide a rich and immersive experience to your users.
-To integrate media capabilities you must update the app manifest file and call the media capability APIs.
+To integrate media capabilities you must update the app manifest file and call the media capability APIs.
For effective integration, you must have a good understanding of [code snippets](#code-snippets) for calling the respective APIs, which allow you to use native media capabilities. It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app. > [!NOTE]
+>
> * Currently, Microsoft Teams support for media capabilities is available for mobile clients only. > * Currently, Teams does not support device permissions for multi-window apps, tabs, and the meeting side panel. > * Device permissions are different in the browser. For more information, see [browser device permissions](browser-device-permissions.md).
The [selectMedia](/javascript/api/@microsoft/teams-js/microsoftteams.media.media
* Scan documents, whiteboard, and business cards through the camera. > [!IMPORTANT]
+>
> * The `selectMedia`, `getMedia`, and `viewImages` APIs can be invoked from multiple Teams surfaces, such as task modules, tabs, and personal apps. For more details, see [Entry points for Teams apps](../extensibility-points.md). > * `selectMedia` API has been extended to support microphone and audio properties.
The following image depicts web app experience of `selectMedia` API for micropho
## Error handling
-You must ensure to handle these errors appropriately in your Teams app. The following table lists the error codes and the conditions under which the errors are generated:
+You must ensure to handle these errors appropriately in your Teams app. The following table lists the error codes and the conditions under which the errors are generated:
|Error code | Error name | Condition| | | | -- |
platform People Picker Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/people-picker-capability.md
People Picker is a control to search and select people. This is a native capability available in Teams platform. You can integrate Teams native People Picker input control with your web apps. You can select between single or multi selection, and configurations, such as limiting search within a chat, channels, or across the entire organization.
-You can use [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true), which provides `selectPeople` API to integrate the People Picker within your web app.
+You can use [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true), which provides `selectPeople` API to integrate the People Picker within your web app.
-## Advantages of integrating the native People Picker
+## Advantages of integrating the native People Picker
* People Picker control works in all of Teams surfaces, such as task module, a chat, channel, meeting tab, and personal app. * This control allows you to search for and select users within a chat, channel, or the entire organization.
-* People Picker helps with scenarios involving task assignment, tagging, notifying a user.
+* People Picker helps with scenarios involving task assignment, tagging, notifying a user.
* You can use this readily available control in your web app. It saves the effort and time significantly to build such a control on your own.
-You must call the `selectPeople` API to integrate People Picker control in your Teams app. For effective integration, you must have an understanding of [code snippet](#code-snippet) for calling the API.
+You must call the `selectPeople` API to integrate People Picker control in your Teams app. For effective integration, you must have an understanding of [code snippet](#code-snippet) for calling the API.
It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your web app.
-> [!NOTE]
+> [!NOTE]
> Currently, Microsoft Teams support for People Picker is available for mobile clients only.
-## `selectPeople` API
+## `selectPeople` API
`selectPeople` API enables you to add Teams native `People Picker input control` to your web apps. The API description is as follows:
The `selectPeople` API comes along with following input configurations:
|Configuration parameter|Type|Description| Default value| |--||--|| |`title`| String| It is an optional parameter. It sets title for the People Picker control. | Select people|
-|`setSelected`|String| It is an optional parameter. You must pass Microsoft Azure Active Directory (Azure AD) IDs of the people to be preselected. This parameter preselects people while launching the People Picker control. In case of single selection, only the first valid user is prepopulated ignoring the rest. |Null|
+|`setSelected`|String| It is an optional parameter. You must pass Microsoft Azure Active Directory (Azure AD) IDs of the people to be preselected. This parameter preselects people while launching the People Picker control. In case of single selection, only the first valid user is prepopulated ignoring the rest. |Null|
|`openOrgWideSearchInChatOrChannel`|Boolean | It is an optional parameter. When it is set to true, it launches the People Picker in organization wide scope even if the app is added to a chat or channel. |False| |`singleSelect`|Boolean|It is an optional parameter. When it is set to true, it launches the People Picker restricting the selection to one user only. |False|
The following image depicts the experience of People Picker in a sample web app:
## Error handling
-You must ensure to handle the errors appropriately in your web app. The following table lists the error codes and the conditions under which the errors are generated:
+You must ensure to handle the errors appropriately in your web app. The following table lists the error codes and the conditions under which the errors are generated:
|Error code | Error name | Condition| | | | -- |
platform Qr Barcode Scanner Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/device-capabilities/qr-barcode-scanner-capability.md
# Integrate QR or barcode scanner capability
-Barcode is a method of representing data in a visual and machine-readable form. The barcode contains information about a product, such as a type, size, manufacturer, and Country of origin in the form of bars and spaces. The code is read using the optical scanner on your native device camera. For a richer collaborative experience, you can integrate the QR or barcode scanner capability provided in the Teams platform with your Teams app.
+Barcode is a method of representing data in a visual and machine-readable form. The barcode contains information about a product, such as a type, size, manufacturer, and Country of origin in the form of bars and spaces. The code is read using the optical scanner on your native device camera. For a richer collaborative experience, you can integrate the QR or barcode scanner capability provided in the Teams platform with your Teams app.
You can use [Microsoft Teams JavaScript client SDK](/javascript/api/overview/msteams-client?view=msteams-client-js-latest&preserve-view=true), which provides the tools necessary for your app to access the userΓÇÖs [native device capabilities](native-device-permissions.md). Use the [scanBarCode](/javascript/api/@microsoft/teams-js/microsoftteams.media?view=msteams-client-js-latest&preserve-view=true#scanBarCode__error__SdkError__decodedText__string_____void__BarCodeConfig_) API to integrate the scanner capability within your app. ## Advantage of integrating QR or barcode scanner capability
-Following are the advantages of integration of QR or barcode scanner capabilities:
+Following are the advantages of integration of QR or barcode scanner capabilities:
* The integration allows web app developers on Teams platform to leverage QR or barcode scanning functionality with Teams JavaScript client SDK. * With this feature, the user only needs to align a QR or barcode within a frame at the center of the scanner UI and the code gets scanned automatically. The stored data is shared back with the calling web app. This avoids the inconvenience and human errors of entering lengthy product codes or other relevant information manually.
Following are the advantages of integration of QR or barcode scanner capabilitie
To integrate QR or barcode scanner capability, you must update the app manifest file and call the [scanBarCode](/javascript/api/@microsoft/teams-js/microsoftteams.media?view=msteams-client-js-latest&preserve-view=true#scanBarCode__error__SdkError__decodedText__string_____void__BarCodeConfig_) API. For effective integration, you must have a good understanding of [code snippet](#code-snippet) for calling the [scanBarCode](/javascript/api/@microsoft/teams-js/microsoftteams.media?view=msteams-client-js-latest&preserve-view=true#scanBarCode__error__SdkError__decodedText__string_____void__BarCodeConfig_) API, which allows you to use native QR or barcode scanner capability. The API gives an error for an unsupported barcode standard. It is important to familiarize yourself with the [API response errors](#error-handling) to handle the errors in your Teams app.
-> [!NOTE]
+> [!NOTE]
> Currently, Microsoft Teams support for QR or barcode scanner capability is only available for mobile clients. ## Update manifest
The **scanBarCode()** API supports the following barcode types:
| Barcode Type | Supported on Android | Supported on iOS | | - | - | | | Codebar | Yes | No |
-| Code 39 | Yes | Yes |
+| Code 39 | Yes | Yes |
| Code 93 | Yes | Yes | | Code 128 | Yes | Yes | | EAN-13 | Yes | Yes |
The following image depicts web app experience of QR or barcode scanner capabili
## Error handling
-You must ensure to handle these errors appropriately in your Teams app. The following table lists the error codes and the conditions under which the errors are generated:
+You must ensure to handle these errors appropriately in your Teams app. The following table lists the error codes and the conditions under which the errors are generated:
|Error code | Error name | Condition| | | | -- |
platform Feedback https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/feedback.md
Use **Azure Admin Center** or **Microsoft 365 Admin Center** for any **business-
| **Product support** | **Contact** | |:|:|
-| **Microsoft Teams product issues and failures** | If you have a Premier support contract for :::image type="icon" source="assets/icons/microsoft-icon.png" border="false"::: Microsoft 365, visit the Microsoft 365 Admin Center and use the Support menu to [open a service request ](https://admin.microsoft.com/). |
+| **Microsoft Teams product issues and failures** | If you have a Premier support contract for :::image type="icon" source="assets/icons/microsoft-icon.png" border="false"::: Microsoft 365, visit the Microsoft 365 Admin Center and use the Support menu to [open a service request](https://admin.microsoft.com/). |
| **Azure help and support** | If you have a paid Azure subscription, visit the Azure Admin Center to [open a ticket](https://ms.portal.azure.com/#blade/Microsoft_Azure_Support/HelpAndSupportBlade/newsupportreq). |
-| **General questions about Microsoft Teams** | If you have general questions on Microsoft Teams, submit your questions on :::image type="icon" source="assets/icons/microsoft-icon.png" border="false"::: [Microsoft Teams Community](https://answers.microsoft.com/en-us/msteams/forum).|
+| **General questions about Microsoft Teams** | If you have general questions on Microsoft Teams, submit your questions on :::image type="icon" source="assets/icons/microsoft-icon.png" border="false"::: [Microsoft Teams Community](https://answers.microsoft.com/msteams/forum).|
## Developer community help+ Microsoft Teams community of developers use Stack Overflow and Microsoft Q&A to connect with other developers to ideate, get clarifications, and submit queries. In addition, you can also use other contacts or sites, depending on the type of community help required to raise issues, limitations, and general questions. ### Developer community forums
Post your questions and help other community members by sharing and responding t
|**Community help** | <ul> <li>:::image type="icon" source="assets/icons/stack-overflow-icon.png" border="false"::: [Stack Overflow](https://stackoverflow.com/questions/tagged/microsoft-teams): Use the `microsoft-teams` tag to post questions. Follow the Stack Overflow guidelines, such as providing a descriptive title, a concise problem statement, and details to reproduce the issue. Feature requests or broad questions are off-topic. If you are a new user, see [Stack Overflow Help Center](https://stackoverflow.com/help).</li> <li>:::image type="icon" source="assets/icons/microsoft-icon.png" border="false"::: [Microsoft Q&A](/answers/topics/office-teams-app-dev.html): We love Stack Overflow and provide extensive support to questions posted on Stack Overflow. Use the `office-teams-app-dev` tag to post questions. Stack Overflow has criteria about appropriate questions and [Microsoft Q&A](/answers/topics/office-teams-app-dev.html) has an open policy regarding this. </li><ul> | | **Community chat group** | Use the informal community chat room for :::image type="icon" source="assets/icons/Teams-icon.png" border="false":::[Microsoft Teams app developers](https://gitter.im/OfficeDev/MicrosoftTeamsAppDev). Select **SIGN IN TO START TALKING**, if signing in for the first time. Select **JOIN ROOM**, if already logged in. | - ### Report issues Submit issues and ask general questions related to SDK and samples using the community help channels.
Submit issues and ask general questions related to SDK and samples using the com
| **Bot and Messaging Extension SDK issues or suggestions** | Submit issues and feature requests to the SDK repository for your bot's language ([C#](https://github.com/Microsoft/botbuilder-dotnet/), [JavaScript](https://github.com/Microsoft/botbuilder-js), or [Python](https://github.com/Microsoft/botbuilder-python)). Post How-to questions at [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework%20microsoft-teams) using the `botframework` and `microsoft-teams` tag. | | **Tab SDK issues or suggestions** | Submit issues and feature requests to the SDK repository for [Microsoft Teams JavaScript Library](https://github.com/OfficeDev/microsoft-teams-library-js/issues). Use the `microsoft-teams` tag to post how-to questions about the SDK at [Stack Overflow](https://stackoverflow.com/questions/tagged/microsoft-teams). |
-
### Documentation feedback Submit documentation feedback or updates using the community help channels.
platform Deploy Csharp App Studio https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/get-started/deploy-csharp-app-studio.md
Complete the following steps to update the app package:
<img width="450px" alt="App Studio" src="~/assets/images/get-started/AppStudio.png"/> - The sample comes with its own manifest and is designed to build an app package when the project is built. The manifest.json file can be located in Visual Studio in Manifest under ```Microsoft.Teams.Samples.HelloWorld.Web```. In Visual Studio, the manifest.json file is located in under **Manifest** in `Microsoft.Teams.Samples.HelloWorld.Web`. This step is described by the following image:
-
+ <img width="450px" alt="Build the app package on .NET with Visual Studio" src="~/assets/images/get-started/app-package-on-.NET-with-Visual-Studio.png"/> 1. Now to modify this app package, select **Import an existing app** in the **Manifest editor**:
Complete the following steps to update the app package:
On the left-hand side of the Manifest editor there is a list of steps. On the right-hand side there is a list of properties that need to be filled in for each step. As you started with a sample app, much of the information is already completed. The next steps enable you to update the properties of the Hello World app.
-#### App details
+## App details
Select **App details** under **Details**. Select the **Generate** button to create a new App ID.
Your new App ID is similar to `2322041b-72bf-459d-b107-f4f335bc35bd`.
Go through the app details in the right-hand pane including **Developer information** and **Branding** details. These details are important if you are writing a new app for distribution.
-#### Tabs
+## Tabs
It is simple to add tabs to a Teams app. The sample app already supports several tabs, and you can enable them.
-##### Team tab
+### Team tab
Your app can only have one Team tab:
Your app can only have one Team tab:
In this sample, the Team tab is where your configuration page is displayed. Select the **...** symbol of the **Tab configuration url** and choose **Edit** from the drop-down menu. Change the URL to `https://yourteamsapp.ngrok.io/configure` where `yourteamsapp.ngrok.io` must be replaced with the URL that you used when hosting your app.
-##### Personal tabs
+### Personal tabs
Your app can have up to 16 tabs, including the Team tab.
The bot that was imported from the sample does not have an associated App ID. Yo
Complete the following steps to setup your bot:
-1. Select **Delete** next to the imported bot in the bot list. Now there are no bots left to show.
+1. Select **Delete** next to the imported bot in the bot list. Now there are no bots left to show.
1. Select **Setup** to display the **Set up a bot** dialog box. <img width="450px" alt="Adding a bot dialog" src="~/assets/images/get-started/Setupbot.png"/> 1. Add a bot name **Contoso bot** and select all three check boxes under **Scope**.
-1. Choose **Save** to exit the dialog box. App Studio registers your bot with Microsoft and displays your new bot in the bot list.
+1. Choose **Save** to exit the dialog box. App Studio registers your bot with Microsoft and displays your new bot in the bot list.
1. Now open a text file in notepad and copy and paste your new bot ID into it. 1. Click **Generate New Password**, and note the password in the same text file you noted your bot App ID. 1. Update the **Bot endpoint address** to `https://yourteamsapp.ngrok.io/api/messages`, and replace `yourteamsapp.ngrok.io` with the URL that you used when hosting your app.
Complete the following steps to setup your messaging extension:
After entering the details of your app, complete the following steps to register your app in Teams: 1. Use **Test and distribute** of App Studio to install your app in Teams.
-1. Update your hosted application with the App ID and password for your bot. For the sample app, use the same App ID and password for both bot and messaging extension.
+1. Update your hosted application with the App ID and password for your bot. For the sample app, use the same App ID and password for both bot and messaging extension.
1. Select **Test and distribute** under **Finish** in the left-hand pane of App Studio: <img width="450px" alt="Testing your app" src="~/assets/images/get-started/Testanddistribute.png"/>
After entering the details of your app, complete the following steps to register
1. To upload your app to Teams, select the **Install** button under **Test and Distribute**: <img width="450px" alt="Adding a messaging extension dialog" src="~/assets/images/get-started/InstallingHelloWorld.png"/>
-
+ > [!NOTE] > If you are unable to sideload the app, verify whether you have [enabled custom app uploading](../get-started/get-started-dotnet-app-studio.md#enable-sideloading-option).
The sample app requires the environment variables to be set to the values that y
After you've installed the app into Teams, configure it to display the tab that you want the app to load.
-**To configure the app tab**
+To configure the app tab:
1. Go to a channel in the team where you installed the sample app, and select the **'+'** button to add a new tab. 1. Select **Hello World** from the **Add a tab** list. A configuration dialog box is displayed that enables you to select the tab to display in this channel.
After you've installed the app into Teams, configure it to display the tab that
You can now test the bot in Teams.
-**To test your bot**
+To test your bot:
- Select a channel in the team where you registered your app and type `@your-bot-name`. This type of message is called an **\@mention**. The bot replies to any message that you send.
You can now test the bot in Teams.
### Test your messaging extension
-**To test your messaging extension**
+To test your messaging extension:
1. Select **...** below the input box in your conversation view. A menu with the **'Hello World'** app is displayed. 1. Select the menu, a set of random texts is displayed. You can select one of the random texts and that is inserted into your conversation.
You can now test the bot in Teams.
| &nbsp; | &nbsp; | |: | :| |[Back](get-started-overview.md) | &nbsp; |
-|
+|
platform Deploy Nodejs App Studio https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/get-started/deploy-nodejs-app-studio.md
Complete the following steps to update the app package:
On the left-hand side of the Manifest editor there is a list of steps. On the right-hand side there is a list of properties that need to be filled in for each step. As you started with a sample app, much of the information is already completed. The next steps enable you to update the properties of the Hello World app.
-#### App details
+## App details
Select **App details** under **Details**. Select the **Generate** button to create a new App ID.
Your new App ID is similar to `2322041b-72bf-459d-b107-f4f335bc35bd`.
Go through the app details in the right-hand pane including **Developer information** and **Branding** details. These details are important if you are writing a new app for distribution.
-#### Tabs
+## Tabs
It is simple to add tabs to a Teams app. The sample app already supports several tabs, and you can enable them.
-##### Team tab
+### Team tab
Your app can only have one Team tab:
Your app can only have one Team tab:
In this sample, the Team tab is where your configuration page is displayed. Select the **...** symbol of the **Tab configuration url** and choose **Edit** from the drop-down menu. Change the URL to `https://yourteamsapp.ngrok.io/configure` where `yourteamsapp.ngrok.io` must be replaced with the URL that you used when hosting your app.
-##### Personal tabs
+### Personal tabs
Your app can have up to 16 tabs, including the Team tab.
Personal tabs are different from the Team tab. **Hello Tab** is already listed i
Update the following boxes with your app URL: -- Change the **Content URL** box to `https://yourteamsapp.ngrok.io/hello`-- Change the **Website URL** box to `https://yourteamsapp.ngrok.io/hello`
+* Change the **Content URL** box to `https://yourteamsapp.ngrok.io/hello`
+* Change the **Website URL** box to `https://yourteamsapp.ngrok.io/hello`
Replace `yourteamsapp.ngrok.io` by the URL that you used when hosting your app.
The bot that was imported from the sample does not have an associated App ID. Yo
Complete the following steps to setup your bot:
-1. Select **Delete** next to the imported bot in the bot list. Now there are no bots left to show.
+1. Select **Delete** next to the imported bot in the bot list. Now there are no bots left to show.
1. Select **Setup** to display the **Set up a bot** dialog box. <img width="450px" alt="Adding a bot dialog" src="~/assets/images/get-started/Setupbot.png"/> 1. Add a bot name **Contoso bot** and select all three check boxes under **Scope**.
-1. Choose **Save** to exit the dialog box. App Studio registers your bot with Microsoft and displays your new bot in the bot list.
+1. Choose **Save** to exit the dialog box. App Studio registers your bot with Microsoft and displays your new bot in the bot list.
1. Now open a text file in notepad and copy and paste your new bot ID into it. 1. Click **Generate New Password**, and note the password in the same text file you noted your bot App ID. 1. Update the **Bot endpoint address** to `https://yourteamsapp.ngrok.io/api/messages`, and replace `yourteamsapp.ngrok.io` with the URL that you used when hosting your app.
Complete the following steps to setup your messaging extension:
Under **New command**:
- - **Command ID**: Enter random text
- - **Title**: Enter random title
- - **Description**: Enter random description
+ * **Command ID**: Enter random text
+ * **Title**: Enter random title
+ * **Description**: Enter random description
Under **Parameter**:
- - **Name**: Enter the parameter name
- - **Title**: Enter the card title
- - **Description**: Enter card description
+ * **Name**: Enter the parameter name
+ * **Title**: Enter the card title
+ * **Description**: Enter card description
1. After you enter the information, select **Save** to close the dialog box.
Complete the following steps to setup your messaging extension:
After entering the details of your app, complete the following steps to register your app in Teams:
-1. Use **Test and distribute** of App Studio to install your app in Teams.
-1. Update your hosted application with the App ID and password for your bot. For the sample app, use the same App ID and password for both bot and messaging extension.
+1. Use **Test and distribute** of App Studio to install your app in Teams.
+1. Update your hosted application with the App ID and password for your bot. For the sample app, use the same App ID and password for both bot and messaging extension.
1. Select **Test and distribute** under **Finish** in the left-hand pane of App Studio: <img width="450px" alt="Testing your app" src="~/assets/images/get-started/Testanddistribute.png"/>
The environment variables are a part of your environment. Only your app's code c
If you're running the app using ngrok, you'll need to set up local environment variables. You can use Visual Studio Code to add a [launch configuration](https://code.visualstudio.com/Docs/editor/debugging#_launch-configurations):
-```
+```json
{ "type": "node", "request": "launch",
If you're running the app using ngrok, you'll need to set up local environment v
Where: -- The authorization credentials for your bot are as follows:
- - MICROSOFT_APP_ID is ID
- - MICROSOFT_APP_PASSWORD is password
-- NODE_DEBUG show you what's happening in your bot in the Visual Studio Code debug console-- NODE_CONFIG_DIR points to the directory at the root of the repository (by default, when the app is run locally, it looks for the root directory in the `src` folder).
+* The authorization credentials for your bot are as follows:
+ * MICROSOFT_APP_ID is ID
+ * MICROSOFT_APP_PASSWORD is password
+* NODE_DEBUG show you what's happening in your bot in the Visual Studio Code debug console
+* NODE_CONFIG_DIR points to the directory at the root of the repository (by default, when the app is run locally, it looks for the root directory in the `src` folder).
> [!Note] > If you have not stopped npm from earlier in the tutorial, you'll need to run `npm stop` in order for Visual Studio Code to pickup your launch configuration variables correctly.
After you install the app into Teams, you need to configure it to show content.
1. Go to a channel in Teams, and select the **'+'** button to add a new tab. 1. You can then choose `Hello World` from the **Add a tab** list.
-1. In the configuration dialog, select the tab you want to display in the channel. Then, select **Save**.
+1. In the configuration dialog, select the tab you want to display in the channel. Then, select **Save**.
You can see the `Hello World` tab loaded with the tab you chose:
You can now interact with the bot in Teams. Choose a channel in the team where y
### Test your messaging extension
-**To test your messaging extension**
+To test your messaging extension:
+ 1. Select the three dots below the input box in your conversation view. A menu with the **'Hello World'** app is displayed. 1. Select the menu. A set of random texts is displayed. You can select one of the random texts and that is inserted into your conversation.
You can now interact with the bot in Teams. Choose a channel in the team where y
<img width="430px" alt="Messaging extension send" src="~/assets/images/samples-hello-world-messaging-extensions-send.png" /> - | &nbsp; | &nbsp; | |: | :| |[Back](get-started-overview.md) | &nbsp; |
-|
+|
platform Glossary https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/get-started/glossary.md
keywords: Microsoft Teams developer definition
Common terms and definitions used in Teams Developer Documentation. - ## A | Term | Definition |
platform Test Chat Rsc Json File https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/test-chat-rsc-json-file.md
keywords: teams authorization OAuth SSO Azure AD rsc Postman Graph
```json {
- "info": {
- "_postman_id": "36d695ea-3ce2-4b2d-a1ac-b1721d2d46f1",
- "name": "Test-ChatRSC",
- "description": "Collection to test RSC.",
- "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
- },
- "item": [
- {
- "name": "Teams client app installation flow",
- "item": [
- {
- "name": "Chat - Create App Context Token",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "\r",
- " // Set the app_context access token\r",
- " const { access_token } = pm.response.json();\r",
- " pm.environment.set(\"appContextToken\", access_token);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Content-Type",
- "type": "text",
- "value": "application/x-www-form-urlencoded",
- "disabled": true
- }
- ],
- "body": {
- "mode": "urlencoded",
- "urlencoded": [
- {
- "key": "grant_type",
- "value": "client_credentials",
- "type": "text"
- },
- {
- "key": "client_id",
- "value": "{{azureADAppId}}",
- "type": "text"
- },
- {
- "key": "client_secret",
- "value": "{{azureADAppSecret}}",
- "type": "text"
- },
- {
- "key": "scope",
- "value": "{{token_scope}}",
- "type": "text"
- }
- ]
- },
- "url": {
- "raw": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token",
- "protocol": "https",
- "host": [
- "login",
- "microsoftonline",
- "com"
- ],
- "path": [
- "{{tenantId}}",
- "oauth2",
- "v2.0",
- "token"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Chat",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200)\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "Bearer {{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "chats",
- "{{chatId}}"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Chat Members",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200)\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "Bearer {{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/members",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "chats",
- "{{chatId}}",
- "members"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Chat Messages",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200)\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "Bearer {{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/messages",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "chats",
- "{{chatId}}",
- "messages"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Tabs",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "\r",
- " const { internalId } = pm.response.json();\r",
- " pm.environment.set(\"generalChannelId\", internalId);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "Bearer {{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/tabs",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "chats",
- "{{chatId}}",
- "tabs"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get PermissionGrants",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200)\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "Bearer {{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/permissionGrants",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "chats",
- "{{chatId}}",
- "permissionGrants"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get InstalledApps",
- "event": [
- {
- "listen": "test",
- "script": {
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "\r",
- " const { internalId } = pm.response.json();\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "Bearer {{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/installedApps?$expand=teamsApp",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "chats",
- "{{chatId}}",
- "installedApps"
- ],
- "query": [
- {
- "key": "$expand",
- "value": "teamsApp"
- }
- ]
- }
- },
- "response": []
- }
- ]
- }
- ]
+ "info": {
+ "_postman_id": "36d695ea-3ce2-4b2d-a1ac-b1721d2d46f1",
+ "name": "Test-ChatRSC",
+ "description": "Collection to test RSC.",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "Teams client app installation flow",
+ "item": [
+ {
+ "name": "Chat - Create App Context Token",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "\r",
+ " // Set the app_context access token\r",
+ " const { access_token } = pm.response.json();\r",
+ " pm.environment.set(\"appContextToken\", access_token);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/x-www-form-urlencoded",
+ "disabled": true
+ }
+ ],
+ "body": {
+ "mode": "urlencoded",
+ "urlencoded": [
+ {
+ "key": "grant_type",
+ "value": "client_credentials",
+ "type": "text"
+ },
+ {
+ "key": "client_id",
+ "value": "{{azureADAppId}}",
+ "type": "text"
+ },
+ {
+ "key": "client_secret",
+ "value": "{{azureADAppSecret}}",
+ "type": "text"
+ },
+ {
+ "key": "scope",
+ "value": "{{token_scope}}",
+ "type": "text"
+ }
+ ]
+ },
+ "url": {
+ "raw": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token",
+ "protocol": "https",
+ "host": [
+ "login",
+ "microsoftonline",
+ "com"
+ ],
+ "path": [
+ "{{tenantId}}",
+ "oauth2",
+ "v2.0",
+ "token"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Chat",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200)\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "Bearer {{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "chats",
+ "{{chatId}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Chat Members",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200)\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "Bearer {{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/members",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "chats",
+ "{{chatId}}",
+ "members"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Chat Messages",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200)\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "Bearer {{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/messages",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "chats",
+ "{{chatId}}",
+ "messages"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Tabs",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "\r",
+ " const { internalId } = pm.response.json();\r",
+ " pm.environment.set(\"generalChannelId\", internalId);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "Bearer {{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/tabs",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "chats",
+ "{{chatId}}",
+ "tabs"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get PermissionGrants",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200)\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "Bearer {{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/permissionGrants",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "chats",
+ "{{chatId}}",
+ "permissionGrants"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get InstalledApps",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "\r",
+ " const { internalId } = pm.response.json();\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "Bearer {{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/chats/{{chatId}}/installedApps?$expand=teamsApp",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "chats",
+ "{{chatId}}",
+ "installedApps"
+ ],
+ "query": [
+ {
+ "key": "$expand",
+ "value": "teamsApp"
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ]
+ }
+ ]
} ```
platform Test Resource Specific Consent https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/test-resource-specific-consent.md
Example for RSC in a chat
} } ```
-
+ > [!NOTE] > If the app is meant to support installation in both team and chat scopes, then both team and chat permissions can be specified in the same manifest under `authorization`.
Example for RSC in a chat
> [!NOTE] > If the app is meant to support installation in both team and chat scopes, then both team and chat permissions can be specified in the same manifest under `applicationPermissions`.
-
+ </details> > [!IMPORTANT]
To check whether the RSC permissions are being honored by the API request payloa
1. In the Teams client, select **Teams** from the far left navigation bar. 2. Select the team where the app is installed from the dropdown menu. 3. Select the **More options** icon (&#8943;).
- 4. Select **Get link to team**.
+ 4. Select **Get link to team**.
5. Copy and save the **groupId** value from the string. ## Test added RSC permissions to a chat using the Postman app
To check whether the RSC permissions are being honored by the API request payloa
1. Open the [Postman](https://www.postman.com) app. 2. Select **File** > **Import** > **Import file** to upload the updated JSON file from your environment.
-3. Select the **Collections** tab.
+3. Select the **Collections** tab.
4. Select the chevron **>** next to the **Test RSC** to expand the details view and see the API requests. Execute the entire permissions collection for each API call. The permissions that you specified in your app manifest must succeed, while those not specified must fail with an HTTP 403 status code. Check all of the response status codes to confirm that the behavior of the RSC permissions in your app meet expectations.
Execute the entire permissions collection for each API call. The permissions tha
## Test revoked RSC permissions using [Postman](https://www.postman.com/) 1. Uninstall the app from the specific resource.
-2. Follow the steps for either chat or team:
+2. Follow the steps for either chat or team:
1. [Test added RSC permissions to a team using Postman](#test-added-rsc-permissions-to-a-team-using-the-postman-app). 2. [Test added RSC permissions to a chat using Postman](#test-added-rsc-permissions-to-a-chat-using-the-postman-app). 3. Check all the response status codes to confirm that the specific API calls **have failed with an HTTP 403 status code**.
platform Test Team Rsc Json File https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/graph-api/rsc/test-team-rsc-json-file.md
keywords: teams authorization OAuth SSO Azure AD rsc Postman Graph
```json {
- "info": {
- "_postman_id": "57dc5f09-d719-4d48-a50d-6b09053cc7a7",
- "name": "Test-RSC",
- "description": "Collection to test RSC.",
- "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
- },
- "item": [
- {
- "name": "Create App Context Token",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "1e0d2bb5-8d0d-47a1-a42e-fcd8d58bb8a3",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "\r",
- " // Set the app_context access token\r",
- " const { access_token } = pm.response.json();\r",
- " pm.environment.set(\"appContextToken\", access_token);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Content-Type",
- "type": "text",
- "value": "application/x-www-form-urlencoded",
- "disabled": true
- }
- ],
- "body": {
- "mode": "urlencoded",
- "urlencoded": [
- {
- "key": "grant_type",
- "value": "client_credentials",
- "type": "text"
- },
- {
- "key": "client_id",
- "value": "{{azureADAppId}}",
- "type": "text"
- },
- {
- "key": "client_secret",
- "value": "{{azureADAppSecret}}",
- "type": "text"
- },
- {
- "key": "scope",
- "value": "{{token_scope}}",
- "type": "text"
- }
- ]
- },
- "url": {
- "raw": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token",
- "protocol": "https",
- "host": [
- "login",
- "microsoftonline",
- "com"
- ],
- "path": [
- "{{tenantId}}",
- "oauth2",
- "v2.0",
- "token"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Team",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "92ae0b6b-859c-4210-b9ee-d7e76b1bb523",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "\r",
- " const { internalId } = pm.response.json();\r",
- " pm.environment.set(\"generalChannelId\", internalId);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Edit Team",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "f4fcb689-366e-4d28-9113-45adf84495a5",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(204);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "PATCH",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- },
- {
- "key": "Content-Type",
- "value": "application/json",
- "type": "text"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{ \r\n \"funSettings\": {\r\n \"allowGiphy\": true,\r\n \"giphyContentRating\": \"strict\"\r\n },\r\n}"
- },
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Channels",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "5acf1e2a-e4bb-4146-a4a7-d8677a3356be",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Specific Channel",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "da816d2b-97d6-4cd6-b243-2eb5257cce7c",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "type": "text",
- "value": "{{appContextToken}}"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels",
- "{{generalChannelId}}"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Channel Messages",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "c511c14f-a193-4387-84d1-94d05f12ee67",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "type": "text",
- "value": "{{appContextToken}}"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/messages",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels",
- "{{generalChannelId}}",
- "messages"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Create Channel",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "6e58c6b2-7dd5-4746-b9cb-3b0b1d3b80e7",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "\r",
- "pm.test(\"Status Code 201 or 400\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.expect(pm.response.code).to.be.oneOf([201, 400]); //400 means that at least the permission check \r",
- "});\r",
- "\r",
- "// pm.test(\"Status Code 201\", () => {\r",
- "// // Need to validate the request succeeded. \r",
- "// pm.response.to.have.status(201);\r",
- "// });\r",
- "\r",
- "\r",
- "// pm.test(\"Successful POST request\", function () {\r",
- "// pm.expect(pm.response.code).to.be.oneOf([201, 400]); //400 means that at least the permission check passed\r",
- "// });"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- },
- {
- "key": "Content-Type",
- "value": "application/json",
- "type": "text"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{\r\n \"displayName\": \"ChannelCreatedThruRsc\",\r\n \"description\": \"This channel was created using RSC\",\r\n \"membershipType\": \"standard\"\r\n}",
- "options": {
- "raw": {
- "language": "json"
- }
- }
- },
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get Tabs",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "aeafd689-f2b5-48b7-8f44-4d53f070b46e",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/tabs",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels",
- "{{generalChannelId}}",
- "tabs"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Add Tab",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "0a7cae52-c103-403f-a016-d22c9fe1a477",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 201\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(201);\r",
- "\r",
- " const { id } = pm.response.json();\r",
- " pm.environment.set(\"createdTabId\", id);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "POST",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- },
- {
- "key": "Content-Type",
- "value": "application/json",
- "type": "text"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{\n\t\"teamsApp@odata.bind\":\"https://graph.microsoft.com/beta/appCatalogs/teamsApps/com.microsoft.teamspace.tab.powerbi\",\n\t\"displayName\":\"TabCreatedThroughRsc\"\n}"
- },
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/tabs",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels",
- "{{generalChannelId}}",
- "tabs"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Edit Tab",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "70276fd7-6d40-4305-9628-735170a6e749",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "PATCH",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- },
- {
- "key": "Content-Type",
- "value": "application/json",
- "type": "text"
- }
- ],
- "body": {
- "mode": "raw",
- "raw": "{\n\"displayName\":\"UpdatedTabName\"\n}"
- },
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/tabs/{{createdTabId}}",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "channels",
- "{{generalChannelId}}",
- "tabs",
- "{{createdTabId}}"
- ]
- }
- },
- "response": []
- },
- {
- "name": "Get InstalledApps",
- "event": [
- {
- "listen": "test",
- "script": {
- "id": "14554c18-68b8-45ec-b1fb-33049b72ff95",
- "exec": [
- "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
- "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
- "\r",
- "pm.test(\"Status Code 200\", () => {\r",
- " // Need to validate the request succeeded. \r",
- " pm.response.to.have.status(200);\r",
- "});"
- ],
- "type": "text/javascript"
- }
- }
- ],
- "request": {
- "method": "GET",
- "header": [
- {
- "key": "Authorization",
- "value": "{{appContextToken}}",
- "type": "text"
- }
- ],
- "url": {
- "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/installedApps?$expand=teamsApp",
- "protocol": "https",
- "host": [
- "graph",
- "microsoft",
- "com"
- ],
- "path": [
- "beta",
- "teams",
- "{{teamGroupId}}",
- "installedApps"
- ],
- "query": [
- {
- "key": "$expand",
- "value": "teamsApp"
- }
- ]
- }
- },
- "response": []
- }
- ],
- "protocolProfileBehavior": {}
+ "info": {
+ "_postman_id": "57dc5f09-d719-4d48-a50d-6b09053cc7a7",
+ "name": "Test-RSC",
+ "description": "Collection to test RSC.",
+ "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+ },
+ "item": [
+ {
+ "name": "Create App Context Token",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "1e0d2bb5-8d0d-47a1-a42e-fcd8d58bb8a3",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "\r",
+ " // Set the app_context access token\r",
+ " const { access_token } = pm.response.json();\r",
+ " pm.environment.set(\"appContextToken\", access_token);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Content-Type",
+ "type": "text",
+ "value": "application/x-www-form-urlencoded",
+ "disabled": true
+ }
+ ],
+ "body": {
+ "mode": "urlencoded",
+ "urlencoded": [
+ {
+ "key": "grant_type",
+ "value": "client_credentials",
+ "type": "text"
+ },
+ {
+ "key": "client_id",
+ "value": "{{azureADAppId}}",
+ "type": "text"
+ },
+ {
+ "key": "client_secret",
+ "value": "{{azureADAppSecret}}",
+ "type": "text"
+ },
+ {
+ "key": "scope",
+ "value": "{{token_scope}}",
+ "type": "text"
+ }
+ ]
+ },
+ "url": {
+ "raw": "https://login.microsoftonline.com/{{tenantId}}/oauth2/v2.0/token",
+ "protocol": "https",
+ "host": [
+ "login",
+ "microsoftonline",
+ "com"
+ ],
+ "path": [
+ "{{tenantId}}",
+ "oauth2",
+ "v2.0",
+ "token"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Team",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "92ae0b6b-859c-4210-b9ee-d7e76b1bb523",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "\r",
+ " const { internalId } = pm.response.json();\r",
+ " pm.environment.set(\"generalChannelId\", internalId);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Edit Team",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "f4fcb689-366e-4d28-9113-45adf84495a5",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(204);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{ \r\n \"funSettings\": {\r\n \"allowGiphy\": true,\r\n \"giphyContentRating\": \"strict\"\r\n },\r\n}"
+ },
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Channels",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "5acf1e2a-e4bb-4146-a4a7-d8677a3356be",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Specific Channel",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "da816d2b-97d6-4cd6-b243-2eb5257cce7c",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "type": "text",
+ "value": "{{appContextToken}}"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels",
+ "{{generalChannelId}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Channel Messages",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "c511c14f-a193-4387-84d1-94d05f12ee67",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "type": "text",
+ "value": "{{appContextToken}}"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/messages",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels",
+ "{{generalChannelId}}",
+ "messages"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Create Channel",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "6e58c6b2-7dd5-4746-b9cb-3b0b1d3b80e7",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "\r",
+ "pm.test(\"Status Code 201 or 400\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.expect(pm.response.code).to.be.oneOf([201, 400]); //400 means that at least the permission check \r",
+ "});\r",
+ "\r",
+ "// pm.test(\"Status Code 201\", () => {\r",
+ "// // Need to validate the request succeeded. \r",
+ "// pm.response.to.have.status(201);\r",
+ "// });\r",
+ "\r",
+ "\r",
+ "// pm.test(\"Successful POST request\", function () {\r",
+ "// pm.expect(pm.response.code).to.be.oneOf([201, 400]); //400 means that at least the permission check passed\r",
+ "// });"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\r\n \"displayName\": \"ChannelCreatedThruRsc\",\r\n \"description\": \"This channel was created using RSC\",\r\n \"membershipType\": \"standard\"\r\n}",
+ "options": {
+ "raw": {
+ "language": "json"
+ }
+ }
+ },
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get Tabs",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "aeafd689-f2b5-48b7-8f44-4d53f070b46e",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/tabs",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels",
+ "{{generalChannelId}}",
+ "tabs"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Add Tab",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "0a7cae52-c103-403f-a016-d22c9fe1a477",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 201\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(201);\r",
+ "\r",
+ " const { id } = pm.response.json();\r",
+ " pm.environment.set(\"createdTabId\", id);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "POST",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\t\"teamsApp@odata.bind\":\"https://graph.microsoft.com/beta/appCatalogs/teamsApps/com.microsoft.teamspace.tab.powerbi\",\n\t\"displayName\":\"TabCreatedThroughRsc\"\n}"
+ },
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/tabs",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels",
+ "{{generalChannelId}}",
+ "tabs"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Edit Tab",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "70276fd7-6d40-4305-9628-735170a6e749",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "PATCH",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "type": "text"
+ }
+ ],
+ "body": {
+ "mode": "raw",
+ "raw": "{\n\"displayName\":\"UpdatedTabName\"\n}"
+ },
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/channels/{{generalChannelId}}/tabs/{{createdTabId}}",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "channels",
+ "{{generalChannelId}}",
+ "tabs",
+ "{{createdTabId}}"
+ ]
+ }
+ },
+ "response": []
+ },
+ {
+ "name": "Get InstalledApps",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "id": "14554c18-68b8-45ec-b1fb-33049b72ff95",
+ "exec": [
+ "console.log(\"responseHeaders: \" + JSON.stringify(pm.response.headers));\r",
+ "console.log(\"responseBody: \" + JSON.stringify(pm.response.text()));\r",
+ "\r",
+ "pm.test(\"Status Code 200\", () => {\r",
+ " // Need to validate the request succeeded. \r",
+ " pm.response.to.have.status(200);\r",
+ "});"
+ ],
+ "type": "text/javascript"
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [
+ {
+ "key": "Authorization",
+ "value": "{{appContextToken}}",
+ "type": "text"
+ }
+ ],
+ "url": {
+ "raw": "https://graph.microsoft.com/beta/teams/{{teamGroupId}}/installedApps?$expand=teamsApp",
+ "protocol": "https",
+ "host": [
+ "graph",
+ "microsoft",
+ "com"
+ ],
+ "path": [
+ "beta",
+ "teams",
+ "{{teamGroupId}}",
+ "installedApps"
+ ],
+ "query": [
+ {
+ "key": "$expand",
+ "value": "teamsApp"
+ }
+ ]
+ }
+ },
+ "response": []
+ }
+ ],
+ "protocolProfileBehavior": {}
} ```
platform Extend M365 Teams Message Extension https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-message-extension.md
Search-based [messaging extensions](/microsoftteams/platform/messaging-extension
The process to update your search-based Teams messaging extension to run Outlook involves these steps: > [!div class="checklist"]
+>
> * Update your app manifest > * Add an Outlook channel for your bot > * Sideload your updated app in Teams
The rest of this guide will walk you through these steps and show you how to pre
To complete this tutorial, you'll need:
+* A Microsoft 365 Developer Program sandbox tenant
+* Your sandbox tenant enrolled in *Office 365 Targeted Releases*
+* A test environment with Office apps installed from the Microsoft 365 Apps *beta channel*
+* Microsoft Visual Studio Code with the Teams Toolkit (Preview) extension (Optional)
> [!div class="nextstepaction"] > [Install prerequisites](prerequisites.md)
Open your Teams app manifest and update the `$schema` and `manifestVersion` with
"manifestVersion" : "m365DevPreview" } ```+ If you used Teams Toolkit to create your messaging extension app, you can use it to validate the changes to your manifest file and identify any errors. Open the command palette `Ctrl+Shift+P` and find **Teams: Validate manifest file** or select the option from the Deployment menu of the Teams Toolkit (look for the Teams icon on the left side of Visual Studio Code).
From the *Apps* menu, select *Manage your apps* > **Submit an app to your org**.
#### Microsoft Teams Admin Center
-As a Teams admin, you can upload and pre-install the app package for your organization's tenant from https://admin.teams.microsoft.com/. See [Upload your custom apps in the Microsoft Teams admin center](/MicrosoftTeams/upload-custom-apps) for details.
+As a Teams admin, you can upload and pre-install the app package for your organization's tenant from [Teams admin](https://admin.teams.microsoft.com/). See [Upload your custom apps in the Microsoft Teams admin center](/MicrosoftTeams/upload-custom-apps) for details.
#### Microsoft Admin Center
-As a global admin, you can upload and pre-install the app package from https://admin.microsoft.com/. See [Test and deploy Microsoft 365 Apps by partners in the Integrated apps portal](/microsoft-365/admin/manage/test-and-deploy-microsoft-365-apps) for details.
+As a global admin, you can upload and pre-install the app package from [Microsoft admin](https://admin.microsoft.com/). See [Test and deploy Microsoft 365 Apps by partners in the Integrated apps portal](/microsoft-365/admin/manage/test-and-deploy-microsoft-365-apps) for details.
### Multitenant distribution
platform Extend M365 Teams Personal Tab https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/extend-m365-teams-personal-tab.md
Personal tabs provide a great way to enhance the Microsoft Teams experience. Usi
Updating your personal app to run in Outlook and Office Home involves these steps: > [!div class="checklist"]
+>
> * Update your app manifest
-> * Update your TeamsJS SDK references
+> * Update your TeamsJS SDK references
> * Amend your Content Security Policy headers > * Update your Microsoft Azure Active Directory (Azure AD) App Registration for Single Sign On (SSO) Testing your app will require the following steps: > [!div class="checklist"]
+>
> * Enroll your Microsoft 365 tenant in *Office 365 Targeted Releases* > * Configure your account to access preview versions of Outlook and Office apps > * Sideload your updated app into Teams
If you'd like to use sample code to complete this tutorial, follow the setup ste
:::image type="content" source="images/toolkit-todo-sample.png" alt-text="Todo List sample (Works in Teams, Outlook and Office) in Teams Toolkit"::: - ## Update the app manifest You'll need to use the [Teams developer preview manifest](/microsoftteams/platform/resources/schema/manifest-schema-dev-preview) schema and the `Microsoft 365 DevPreview` manifest version to enable your Teams personal tab to run in Office and Outlook.
Open your Teams app manifest and update the `$schema` and `manifestVersion` with
"manifestVersion" : "m365DevPreview" } ```+ If you used Teams Toolkit to create your personal app, you can also use it to validate the changes to your manifest file and identify any errors. Open the command palette `Ctrl+Shift+P` and find **Teams: Validate manifest file** or select the option from the Deployment menu of the Teams Toolkit (look for the Teams icon on the left side of Visual Studio Code).
You can use Teams Toolkit to help automate some of the code changes to adopt the
Upon completion, the utility will have updated your `package.json` file with the TeamsJS SDK Preview (`@microsoft/teams-js@2.0.0-beta.1` or later) dependency, and your `*.js/.ts` and `*.jsx/.tsx` files will be updated with: > [!div class="checklist"]
+>
> * `package.json` references to TeamsJS SDK Preview > * Import statements for TeamsJS SDK Preview > * [Function, Enum, and Interface calls](using-teams-client-sdk-preview.md#apis-organized-into-capabilities) to TeamsJS SDK Preview
Azure Active Directory Single-sign on (SSO) for personal tabs works the same way
1. Sign in to [Microsoft Azure portal](https://portal.azure.com) with your sandbox tenant account. 1. Open the **App registrations** blade.
-1. Select the name of your personal tab application to open its app registration.
+1. Select the name of your personal tab application to open its app registration.
1. Select **Expose an API** (under *Manage*). :::image type="content" source="images/azure-app-registration-clients.png" alt-text="Authorize client Ids from the *App registrations* blade on Azure portal":::
To view your app running in Outlook on Windows desktop:
1. Launch Outlook and sign in using your dev tenant account. 1. Click on the ellipses (**...**) on the side bar. Your sideloaded app title will appear among your installed apps.
-1. Click on your app icon to launch your app in Outlook.
+1. Click on your app icon to launch your app in Outlook.
:::image type="content" source="images/outlook-desktop-more-apps.png" alt-text="Click on the ellipses ('More apps') option on the side bar of Outlook desktop client to see your installed personal tabs":::
To view your app running in Outlook on Windows desktop:
To view your app in Outlook on the web:
-1. Navigate to https://outlook.office.com and sign in using your dev tenant account.
+1. Navigate to [Outlook on the web](https://outlook.office.com) and sign in using your dev tenant account.
1. Click on the ellipses (**...**) on the side bar. Your sideloaded app title will appear among your installed apps. 1. Click on your app icon to launch and preview your app running in Outlook on the web.
From the *Apps* menu, select *Manage your apps* > **Submit an app to your org**.
#### Microsoft Teams Admin Center
-As a Teams admin, you can upload and pre-install the app package for your organization's tenant from https://admin.teams.microsoft.com/. See [Upload your custom apps in the Microsoft Teams admin center](/MicrosoftTeams/upload-custom-apps) for details.
+As a Teams admin, you can upload and pre-install the app package for your organization's tenant from [Teams admin](https://admin.teams.microsoft.com/). See [Upload your custom apps in the Microsoft Teams admin center](/MicrosoftTeams/upload-custom-apps) for details.
#### Microsoft Admin Center
-As a global admin, you can upload and pre-install the app package from https://admin.microsoft.com/. See [Test and deploy Microsoft 365 Apps by partners in the Integrated apps portal](/microsoft-365/admin/manage/test-and-deploy-microsoft-365-apps) for details.
+As a global admin, you can upload and pre-install the app package from [Microsoft admin](https://admin.microsoft.com/). See [Test and deploy Microsoft 365 Apps by partners in the Integrated apps portal](/microsoft-365/admin/manage/test-and-deploy-microsoft-365-apps) for details.
### Multitenant distribution
platform Prerequisites https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/m365-apps/prerequisites.md
The development environment for extending Teams apps across Microsoft 365 is sim
To set up your development environment: > [!div class="checklist"]
+>
> * [Get Microsoft 365 Developer (Sandbox) Tenant and enable sideloading](#prepare-a-developer-tenant-for-testing) > * [Enroll your Microsoft 365 tenant in *Office 365 Targeted Releases*](#enroll-your-developer-tenant-for-office-365-targeted-releases) > * [Configure your account to access preview versions of Outlook and Office](#install-office-apps-in-your-test-environment)
To enroll your test tenant for Office 365 targeted releases:
1. **Target release for select users** :::image type="content" source="images/m365-admin-center-targeted-releases.png" alt-text="Microsoft 365 admin center 'Release preferences' menu with Targeted release option selected":::
-
+ 1. Select **Save**. For more information on Office 365 release options, see [Set up the Standard or Targeted release options](/microsoft-365/admin/manage/release-options-in-office-365?view=o365-worldwide&preserve-view=true#targeted-release) in *Microsoft 365 admin center help*.
To install Office 365 Beta Channel applications in your test environment:
1. Open **File** > **Office Account** > **About Outlook**. If the build number is **14416** or higher and the channel is *Beta Channel*, you're running Microsoft 365 beta Channel build. 1. In the top-right corner, turn on the **Coming Soon** toggle.
-
+ :::image type="content" source="images/outlook-coming-soon.png" alt-text="'Coming Soon' toggle option in Outlook"::: > [!NOTE]
The extension [Teams Toolkit for Visual Studio Code](https://aka.ms/teams-toolki
## Next steps -- [Enable a Teams personal tab for Office and Outlook](extend-m365-teams-personal-tab.md)-- [Enable a Teams messaging extension for Outlook](extend-m365-teams-message-extension.md)
+* [Enable a Teams personal tab for Office and Outlook](extend-m365-teams-personal-tab.md)
+* [Enable a Teams messaging extension for Outlook](extend-m365-teams-message-extension.md)
platform Create Task Module https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/action-commands/create-task-module.md
# Create and send the task module
-
+ [!include[v4-to-v3-SDK-pointer](~/includes/v4-to-v3-pointer-me.md)]
-You can create the task module using an Adaptive Card or an embedded web view. To create a task module, you must perform the process called the initial invoke request. This document covers
-the initial invoke request, payload activity properties when a task module is invoked from 1:1 chat, group chat, channel (new post), channel (reply to thread), and command box.
+You can create the task module using an Adaptive Card or an embedded web view. To create a task module, you must perform the process called the initial invoke request. This document covers
+the initial invoke request, payload activity properties when a task module is invoked from 1:1 chat, group chat, channel (new post), channel (reply to thread), and command box.
> [!NOTE] > If you are not populating the task module with parameters defined in the app manifest, you must create the task module for users with either an Adaptive Card or an embedded web view.
The code for the initial invoke request is given in the following example:
"name": "composeExtension/fetchTask" ```
-## Payload activity properties when a task module is invoked from 1:1 chat
+## Payload activity properties when a task module is invoked from 1:1 chat
The payload activity properties when a task module is invoked from 1:1 chat are listed as follows:
The payload activity properties when a task module is invoked from 1:1 chat are
} ```
-## Payload activity properties when a task module is invoked from a group chat
+## Payload activity properties when a task module is invoked from a group chat
The payload activity properties when a task module is invoked from a group chat are listed as follows:
The payload activity properties when a task module is invoked from a meeting cha
} ```
-## Payload activity properties when a task module is invoked from a channel (new post)
+## Payload activity properties when a task module is invoked from a channel (new post)
The payload activity properties when a task module is invoked from a channel (new post) are listed as follows:
The payload activity properties when a task module is invoked from a channel (ne
} ```
-## Payload activity properties when a task module is invoked from a channel (reply to thread)
+## Payload activity properties when a task module is invoked from a channel (reply to thread)
The payload activity properties when a task module is invoked from a channel (reply to thread) are listed as follows:
The payload activity properties when a task module is invoked from a channel (re
} ```
-## Payload activity properties when a task module is invoked from a command box
+## Payload activity properties when a task module is invoked from a command box
The payload activity properties when a task module is invoked from a command box are listed as follows:
The payload activity properties when a task module is invoked from a command box
} ```
-### Example
+### Example
The following code section is an example of `fetchTask` request:
class TeamsMessagingExtensionsActionPreviewBot extends TeamsActivityHandler {
## Initial invoke request from a message
-When your bot is invoked from a message, the `value` object in the initial invoke request must contain the details of the message that your messaging extension is invoked from. The `reactions` and `mentions` arrays are optional, and they are not present if there are no reactions or mentions in the original message.
+When your bot is invoked from a message, the `value` object in the initial invoke request must contain the details of the message that your messaging extension is invoked from. The `reactions` and `mentions` arrays are optional, and they are not present if there are no reactions or mentions in the original message.
The following section is an example of the `value` object: # [C#/.NET](#tab/dotnet)
class TeamsMessagingExtensionsActionPreview extends TeamsActivityHandler {
### Create a task module with an embedded web view
-When using an embedded web view, you must respond with a `task` object with the `value` object containing the URL to the web form that you want to load. The domains of any URL you want to load must be included in the `validDomains` array in your app's manifest. For more information on building your embedded web view, see the [task module documentation](~/task-modules-and-cards/what-are-task-modules.md).
+When using an embedded web view, you must respond with a `task` object with the `value` object containing the URL to the web form that you want to load. The domains of any URL you want to load must be included in the `validDomains` array in your app's manifest. For more information on building your embedded web view, see the [task module documentation](~/task-modules-and-cards/what-are-task-modules.md).
# [C#/.NET](#tab/dotnet)
If the app contains a conversational bot, install the bot in the conversation an
When the messaging extension receives the `composeExtension/fetchTask` invoke, check if the bot is installed in the current context to facilitate the flow. For example, check the flow with a get roster call. If the bot is not installed, return an Adaptive Card with an action that requests the user to install the bot. The user must have the permission to install the apps in that location for checking. If the app installation is unsuccessful, the user receives a message to contact the administrator.
-#### Example
+#### Example
The following code section is an example of the response:
The following code section is an example of the response:
After the installation of conversational bot, it receives another invoke message with `name = composeExtension/submitAction`, and `value.data.msteams.justInTimeInstall = true`.
-#### Example
+#### Example
The following code section is an example of the task response to the invoke:
The following code section is an example of the task response to the invoke:
The task response to the invoke must be similar to that of the installed bot.
-#### Example
+#### Example
-The following code section is an example of just-in time installation of app with Adaptive card:
+The following code section is an example of just-in time installation of app with Adaptive card:
```csharp private static Attachment GetAdaptiveCardAttachmentFromFile(string fileName)
private static Attachment GetAdaptiveCardAttachmentFromFile(string fileName)
## Code sample
-| Sample Name | Description | .NET | Node.js |
+| Sample Name | Description | .NET | Node.js |
|:|:--|:|:--|
-|Teams messaging extension action| Describes how to define action commands, create task module, and respond to task module submit action. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/51.teams-messaging-extensions-action)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/51.teams-messaging-extensions-action) |
+|Teams messaging extension action| Describes how to define action commands, create task module, and respond to task module submit action. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/51.teams-messaging-extensions-action)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/51.teams-messaging-extensions-action) |
|Teams messaging extension search | Describes how to define search commands and respond to searches. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/50.teams-messaging-extensions-search)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/50.teams-messaging-extensions-search)| ## Next step
-> [!div class="nextstepaction"]
+> [!div class="nextstepaction"]
> [Respond to action command](~/messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md) ## See also
platform Respond To Task Module Submit https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/action-commands/respond-to-task-module-submit.md
You have the following options to respond:
* [Request the user to authenticate](~/messaging-extensions/how-to/add-authentication.md). * [Request the user to provide additional configuration](~/get-started/first-message-extension.md).
-For authentication or configuration, after the user completes the process, the original invoke is resent to your web service. The following table shows which types of responses are available based on the invoke location `commandContext` of the messaging extension:
+For authentication or configuration, after the user completes the process, the original invoke is resent to your web service. The following table shows which types of responses are available based on the invoke location `commandContext` of the messaging extension:
|Response Type | Compose | Command bar | Message | |--|:-:|:-:|::|
For authentication or configuration, after the user completes the process, the o
| No response | Γ£ö | Γ£ö | Γ£ö | > [!NOTE]
+>
> * When you select **Action.Submit** through ME cards, it sends invoke activity with the name **composeExtension**, where the value is equal to the usual payload. > * When you select **Action.Submit** through conversation, you receive message activity with the name **onCardButtonClicked**, where the value is equal to the usual payload.
You can select to respond to the `submitAction` event with an additional task mo
* Collect large amounts of information. * Dynamically change the information collection based on user input.
-* Validate the information submitted by the user and resend the form with an error message if something is wrong.
+* Validate the information submitted by the user and resend the form with an error message if something is wrong.
The method for response is the same as [responding to the initial `fetchTask` event](~/messaging-extensions/how-to/action-commands/create-task-module.md). If you're using the Bot Framework SDK the same event triggers for both submit actions. To make this work, you must add logic that determines the correct response.
The method for response is the same as [responding to the initial `fetchTask` ev
> [!NOTE] > The prerequisite to get the bot response with an Adaptive card is that you must add the `bot` object to your app manifest, and define the required scope for the bot. Use the same ID as your messaging extension for your bot.
-
-You can also respond to the `submitAction` by inserting a message with an Adaptive Card into the channel with a bot. The user can preview the message before submitting it. This is useful in scenarios where you gather information from the users before creating an Adaptive Card response, or when you update the card after someone interacts with it.
+
+You can also respond to the `submitAction` by inserting a message with an Adaptive Card into the channel with a bot. The user can preview the message before submitting it. This is useful in scenarios where you gather information from the users before creating an Adaptive Card response, or when you update the card after someone interacts with it.
The following scenario shows how the app Polly configures a poll without including the configuration steps in the channel conversation:
-**To configure the poll**
+To configure the poll:
1. The user selects the messaging extension to invoke the task module. 1. The user configures the poll with the task module. 1. After submitting the task module, the app uses the information provided to build the poll as an Adaptive Card and sends it as a `botMessagePreview` response to the client. 1. The user can then preview the Adaptive Card message before the bot inserts it into the channel. If the app is not a member of the channel, select `Send` to add it.
- > [!NOTE]
- > * The users can also select to `Edit` the message, which returns them to the original task module.
+ > [!NOTE]
+ >
+ > * The users can also select to `Edit` the message, which returns them to the original task module.
> * Interaction with the Adaptive Card changes the message before sending it.
+ >
1. After the user selects `Send` the bot posts the message to the channel. ## Respond to initial submit action
class TeamsMessagingExtensionsActionPreview extends TeamsActivityHandler {
# [JSON](#tab/json) > [!NOTE]
+>
> * The `activityPreview` must contain a `message` activity with exactly one Adaptive Card attachment. The `<< Card Payload >>` value is a placeholder for the card you want to send. ```json
You receive a new `composeExtension/submitAction` message similar to the followi
* * *
-### User attribution for bots messages
+### User attribution for bots messages
In scenarios where a bot sends messages on behalf of a user, attributing the message to that user helps with engagement and showcase a more natural interaction flow. This feature allows you to attribute a message from your bot to a user on whose behalf it was sent.
The following section is a description of the entities in the `OnBehalfOf` Array
## Code sample
-| Sample Name | Description | .NET | Node.js |
+| Sample Name | Description | .NET | Node.js |
|:|:--|:|:--|
-|Teams messaging extension action| Describes how to define action commands, create task module, and respond to task module submit action. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/51.teams-messaging-extensions-action)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/51.teams-messaging-extensions-action) |
+|Teams messaging extension action| Describes how to define action commands, create task module, and respond to task module submit action. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/51.teams-messaging-extensions-action)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/51.teams-messaging-extensions-action) |
|Teams messaging extension search | Describes how to define search commands and respond to searches. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/50.teams-messaging-extensions-search)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/50.teams-messaging-extensions-search)| ## Next Step
platform Add Authentication https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/add-authentication.md
To prompt an unauthenticated user to sign in, respond with a suggested action of
``` > [!NOTE]
+>
> * For the sign in experience to be hosted in a Teams pop-up window, the domain portion of the URL must be in your appΓÇÖs list of valid domains. For more information, see [validDomains](~/resources/schem#validdomains) in the manifest schema. > * The size of the authentication pop-up can be defined by including query string parameters of width and height, `Value = $"{_siteUrl}/searchSettings.html?settings={escapedSettings}",`.
At this point, the window closes and the control is passed to the Teams client.
``` ## Code sample+ |**Sample name** | **Description** |**.NET** | **Node.js**| |-|--|--|-|
-|Messaging extensions - auth and config | A Messaging Extension that has a configuration page, accepts search requests, and returns results after the user has signed in. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/52.teams-messaging-extensions-search-auth-config)|[View](https://github.com/microsoft/BotBuilder-Samples/blob/main/samples/javascript_nodejs/52.teams-messaging-extensions-search-auth-config)|
+|Messaging extensions - auth and config | A Messaging Extension that has a configuration page, accepts search requests, and returns results after the user has signed in. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/52.teams-messaging-extensions-search-auth-config)|[View](https://github.com/microsoft/BotBuilder-Samples/blob/main/samples/javascript_nodejs/52.teams-messaging-extensions-search-auth-config)|
## See also
platform Enable SSO Auth Me https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/enable-SSO-auth-me.md
# Single sign-on support for messaging extensions
-
+ Single sign-on (SSO) support is now available for messaging extensions and link unfurling. Enabling Single sign-on for messaging extensions by default refreshes the authentication token, which minimizes the number of times you need to enter the sign in credentials for Microsoft Teams. This document guides you on how to enable the SSO and store your authentication token, if necessary.
The prerequisite to enable SSO for messaging extensions and link unfurling are a
After the prerequisites are completed, you can enable SSO for messaging extensions and link unfurling.
-**To enable SSO**
+To enable SSO:
+ 1. Update your bots [OAuth connection](../../bots/how-to/authentication/auth-aad-sso-bots.md#update-the-azure-portal-with-the-oauth-connection) details in the Microsoft Azure portal. 2. Download the [messaging extensions sample](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/52.teams-messaging-extensions-search-auth-config) and follow the setup instructions provided by the wizard. > [!NOTE]
After the prerequisites are completed, you can enable SSO for messaging extensio
> [!NOTE] > We do not support other handlers SSO, except `OnTeamsMessagingExtensionQueryAsync` and `OnTeamsAppBasedLinkQueryAsync` from the TeamsMessagingExtensionsSearchAuthConfigBot.cs file.
-
+ 4. You receive the token in `OnTeamsMessagingExtensionQueryAsync` handler in the `turnContext.Activity.Value` payload or in the `OnTeamsAppBasedLinkQueryAsync`, depending on which scenario you are enabling the SSO for: ```json
After the prerequisites are completed, you can enable SSO for messaging extensio
``` If you're using the OAuth connection, add the following code to the TeamsMessagingExtensionsSearchAuthConfigBot.cs file to update or add the token in the store:
-
+ ```C# protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext<IInvokeActivity> turnContext, CancellationToken cancellationToken) {
After the prerequisites are completed, you can enable SSO for messaging extensio
return true; }
- ```
+ ```
## See also
platform Link Unfurling https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/link-unfurling.md
This document guides you on how to add link unfurling to your app manifest using App studio and manually. With link unfurling, your app can register to receive an `invoke` activity when URLs with a particular domain are pasted into the compose message area. The `invoke` contains the full URL that was pasted into the compose message area, and you can respond with a card that the user can unfurl, providing additional information or actions. This works similar to a search command with the URL serving as the search term. > [!NOTE]
+>
> * Currently, link unfurling is not supported on Mobile clients. > * The link unfurling result is cached for 30 minutes.
To add link unfurling to your app manifest, add a new `messageHandlers` array to
![message handlers section in App Studio](~/assets/images/link-unfurling.png)
-
### Add link unfurling manually
-To enable your messaging extension to interact with links, first you must add the `messageHandlers` array to your app manifest. The following example explains how to add link unfurling manually:
-
+To enable your messaging extension to interact with links, first you must add the `messageHandlers` array to your app manifest. The following example explains how to add link unfurling manually:
```json ...
Following is an example of the response:
* * *
-## See also
+## See also
* [Cards](~/task-modules-and-cards/what-are-cards.md) * [Tabs link unfurling and Stage View](~/tabs/tabs-link-unfurling.md)
platform Define Search Command https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/search-commands/define-search-command.md
To add the search command to your app manifest, you must add a new `composeExten
The prerequisite to create a search command is that you must already have created a messaging extension. For information on how to create a messaging extension, see [create a messaging extension](~/messaging-extensions/how-to/create-messaging-extension.md).
-**To create a search command**
+To create a search command:
1. Open **App Studio** from the Microsoft Teams client, and select the **Manifest Editor** tab.
-1. If you already created your app package in **App Studio**, select from the list. If you have not created an app package, import an existing one.
+1. If you already created your app package in **App Studio**, select from the list. If you have not created an app package, import an existing one.
1. After importing app package, select **Messaging extensions** under **Capabilities**. You get a pop-up window to set up the messaging extension.
-1. Select **Set up** in the window to include the messaging extension in your app experience. The following image displays the messaging extension set up page:
+1. Select **Set up** in the window to include the messaging extension in your app experience. The following image displays the messaging extension set up page:
<img src="~/assets/images/messaging-extension/messaging-extension-set-up.png" alt="messaging extension set up" width="500"/>
The prerequisite to create a search command is that you must already have create
<img src="~/assets/images/messaging-extension/create-bot-for-messaging-extension.png" alt="create bot for messaging extension" width="500"/>
-1. Select **Add** in the **Command section** of the messaging extensions page to include the commands which decides the behaviour of messaging extension.
+1. Select **Add** in the **Command section** of the messaging extensions page to include the commands which decides the behaviour of messaging extension.
The following image displays command addition for messaging extension: <img src="~/assets/images/messaging-extension/include-command.png" alt="include command" width="500"/>
Following section is an example of the simple app manifest of the `composeExtens
... } ```+ For the complete app manifest, see [App manifest schema](~/resources/schem). ## Code sample
Follow the [step-by-step guide](../../../sbs-messagingextension-searchcommand.ym
> [!div class="nextstepaction"] > [Respond to the search commands](~/messaging-extensions/how-to/search-commands/respond-to-search.md).-
platform Respond To Search https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/messaging-extensions/how-to/search-commands/respond-to-search.md
To learn how to use the thumbnail and hero card types, see [add cards and card a
For additional information about the Office 365 Connector card, see [Using Office 365 Connector cards](~/task-modules-and-cards/cards/cards-reference.md#office-365-connector-card). - The result list is displayed in the Microsoft Teams UI with a preview of each item. The preview is generated in one of the two ways: * Using the `preview` property within the `attachment` object. The `preview` attachment can only be a Hero or a Thumbnail card.
The default query has the same structure as any regular user query, with the `na
## Code sample
-| Sample Name | Description | .NET | Node.js |
+| Sample Name | Description | .NET | Node.js |
|:|:--|:|:--|
-|Teams messaging extension action| Describes how to define action commands, create task module, and respond to task module submit action. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/51.teams-messaging-extensions-action)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/51.teams-messaging-extensions-action) |
+|Teams messaging extension action| Describes how to define action commands, create task module, and respond to task module submit action. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/51.teams-messaging-extensions-action)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/51.teams-messaging-extensions-action) |
|Teams messaging extension search | Describes how to define search commands and respond to searches. |[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/50.teams-messaging-extensions-search)|[View](https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/50.teams-messaging-extensions-search)| ## Next step
platform Auth Flow Bot https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bot-authentication/auth-flow-bot.md
for an example that demonstrates authentication flow for bots using Node using t
7. The provider takes the user to the bot's OAuth redirect page, with an authorization code. 8. The bot redeems the authorization code for an access token, and **provisionally** associates the token with the user that initiated the sign-in flow. Below, we call this a *provisional token*. * In the example, the bot associates the value of the `state` parameter with the id of the user that initiated the sign-in process so it can later match it with the `state` value returned by the identity provider. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/AuthBot.ts#L70-L99))
- * **IMPORTANT**: The bot stores the token it receives from the identity provider and associates it with a specific user, but it is marked as "pending validation". The provisional token cannot be used yet: it must be further validated:
- 1. **Validate what's received from the identity provider.** The value of the `state` parameter must be confirmed against what was saved earlier.
+ * **IMPORTANT**: The bot stores the token it receives from the identity provider and associates it with a specific user, but it is marked as "pending validation". The provisional token cannot be used yet: it must be further validated:
+ 1. **Validate what's received from the identity provider.** The value of the `state` parameter must be confirmed against what was saved earlier.
1. **Validate what's received from Teams.** A [two-step authentication](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) validation is performed to ensure that the user who authorized the bot with the identity provider is the same user who is chatting with the bot. This guards against [man-in-the-middle](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) and [phishing](https://en.wikipedia.org/wiki/Phishing) attacks. The bot generates a verification code and stores it, associated with the user. The verification code is sent automatically by Teams as described below in steps 9 and 10. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/469952a26d618dbf884a3be53c7d921cc580b1e2/src/AuthBot.ts#L100-L113)) 9. The OAuth callback renders a page that calls `notifySuccess("<verification code>")`. ([View code](https://github.com/OfficeDev/microsoft-teams-sample-auth-node/blob/master/src/views/oauth-callback-success.hbs)) 10. Teams closes the popup and sends the `<verification code>` sent to `notifySuccess()` back to the bot. The bot receives an [invoke](/bot-framework/dotnet/bot-builder-dotnet-activities#invoke) message with `name = signin/verifyState`.
platform Bots Conv Channel https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bot-conversations/bots-conv-channel.md
We recommend that your bot *not* send a welcome message in the following situati
## @ Mentions
-Because bots in a group or channel respond only when they are mentioned ("@_botname_") in a message, every message received by a bot in a group channel contains its own name, and you must ensure your message parsing handles that. In addition, bots can parse out other users mentioned and mention users as part of their messages.
+Because bots in a group or channel respond only when they are mentioned ("@*botname*") in a message, every message received by a bot in a group channel contains its own name, and you must ensure your message parsing handles that. In addition, bots can parse out other users mentioned and mention users as part of their messages.
### Retrieving mentions
platform Bots Context https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-context.md
var connector = new ConnectorClient(new Uri(context.Activity.ServiceUrl));
## See also
-[Bot Framework samples](https://github.com/Microsoft/BotBuilder-Samples/blob/master/README.md).
+[Bot Framework samples](https://github.com/Microsoft/BotBuilder-Samples/blob/master/README.md).
platform Bots Create https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-create.md
For more information, see [Bot Framework Documentation](/azure/bot-service/?view
**Teams App Studio** is a tool that can help create your bot, and an app package that references your bot. It also contains a React control library and configurable samples for cards. For more information, see [Getting started with Teams App Studio](~/concepts/build-and-test/app-studio-overview.md). The steps that follow assume that you are hand configuring your bot and not using **Teams App Studio**:
-1. Create the bot using this link: https://dev.botframework.com/bots/new. **Be sure to add Microsoft Teams as a channel from the featured channels list after creating your bot.** Feel free to re-use any Microsoft App ID you generated if you've already created your app package/manifest.
+1. Create the bot using [Bot Framework](https://dev.botframework.com/bots/new). **Be sure to add Microsoft Teams as a channel from the featured channels list after creating your bot.** Feel free to re-use any Microsoft App ID you generated if you've already created your app package/manifest.
![Bot Framework registration page](~/assets/images/bots/bfregister.png) > [!NOTE]
-> If you do not wish to create your bot in Azure, you **must** use this link to create a new bot: https://dev.botframework.com/bots/new. If you click on the **Create a bot** in the Bot Framework portal instead, you will [create your bot in Microsoft Azure](#bots-and-microsoft-azure) instead.
+> If you do not wish to create your bot in Azure, you **must** use this link to create a new bot: [Bot Framework](https://dev.botframework.com/bots/new). If you click on the **Create a bot** in the Bot Framework portal instead, you will [create your bot in Microsoft Azure](#bots-and-microsoft-azure) instead.
2. Build the bot using the [Microsoft.Bot.Connector.Teams](https://www.nuget.org/packages/Microsoft.Bot.Connector.Teams) NuGet package, the [Bot Framework SDK](https://github.com/microsoft/botframework-sdk), or the [Bot Connector API](/bot-framework/rest-api/bot-framework-rest-connector-api-reference).
For more information, see [Bot Framework Documentation](/azure/bot-service/?view
4. Deploy the bot to a cloud service, such as [Microsoft Azure](https://azure.microsoft.com/). Alternatively, run your app locally and use a tunneling service such [ngrok](https://ngrok.com) to expose an https:// endpoint for your bot, such as `https://45az0eb1.ngrok.io/api/messages`. > [!NOTE]
+>
> ## Bots and Microsoft Azure
+>
> As of December, 2017, the Bot Framework portal is optimized for registering bots in Microsoft Azure. Here are some things to know: > > * The Microsoft Teams channel for bots registered on Azure is free. Messages sent over the Teams channel will not count towards the consumed messages for the bot.
-> * While it's possible to [create a new Bot Framework bot](https://dev.botframework.com/bots/new) without using Azure, you must use that URL (https://dev.botframework.com/bots/new), which is no longer exposed in the Bot Framework portal.
+> * While it's possible to [create a new Bot Framework bot](https://dev.botframework.com/bots/new) without using Azure, you must use [create a new Bot Framework bot](https://dev.botframework.com/bots/new), which is no longer exposed in the Bot Framework portal.
> * When you edit the properties of an existing bot in the [list of your bots in Bot Framework](https://dev.botframework.com/bots) such as its "messaging endpoint," which is common when first developing a bot, especially if you use [ngrok](https://ngrok.com), you will see "Migration status" column and a blue "Migrate" button that will take you into the Microsoft Azure portal. Don't click on the "Migrate" button unless that's what you want to do; instead, click on the name of the bot and you can edit its properties:</br> ![Edit Bot Properties](~/assets/images/bots/bf-migrate-bot-to-azure.png) > * If you register your bot using Microsoft Azure, your bot code does not need to be *hosted* on Microsoft Azure.
For more information, see [Bot Framework Documentation](/azure/bot-service/?view
## See also
-[Bot Framework samples](https://github.com/Microsoft/BotBuilder-Samples/blob/master/README.md).
+[Bot Framework samples](https://github.com/Microsoft/BotBuilder-Samples/blob/master/README.md).
platform Bots Menus https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-menus.md
To aid discovery and to help educate users about your botΓÇÖs functionality, you
When a user selects a menu item, the command string is inserted into the text box to aid in user completion of the bot message. ## Bot menu support on Teams mobile app
-> [!NOTE]
+
+> [!NOTE]
> Bot menus are not displayed on mobile devices. ## App manifest
platform Bots Notifications https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-notifications.md
bot.on('conversationUpdate', (msg) => {
### User Added to a meeting
-The `conversationUpdate` event with the `membersAdded` object in the payload is sent when a user is added to a private scheduled meeting. The event details will be sent even when anonymous users join the meeting.
+The `conversationUpdate` event with the `membersAdded` object in the payload is sent when a user is added to a private scheduled meeting. The event details will be sent even when anonymous users join the meeting.
> [!NOTE] >
The `conversationUpdate` event with the `membersRemoved` object in the payload i
### User removed from a meeting
-The `conversationUpdate` event with the `membersRemoved` object in the payload is sent when a user is removed from a private scheduled meeting. The event details will be sent even when anonymous users join the meeting.
+The `conversationUpdate` event with the `membersRemoved` object in the payload is sent when a user is removed from a private scheduled meeting. The event details will be sent even when anonymous users join the meeting.
> [!NOTE] >
platform Bots Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/bot-v3/bots-overview.md
The following topics will guide you through the process of creating a great bot
## See also
-[Bot Framework samples](https://github.com/Microsoft/BotBuilder-Samples/blob/master/README.md).
+[Bot Framework samples](https://github.com/Microsoft/BotBuilder-Samples/blob/master/README.md).
platform Create Messaging Extension Using Appstudio https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/create-messaging-extension-using-appstudio.md
The heart of your messaging extension is your web service. It will define a sing
Messaging extensions take advantage of the Bot Framework's messaging schema and secure communication protocol; if you don't already have one you'll need to register your web service on the Bot Framework. The Microsoft App Id (we'll refer to this as your Bot Id from inside of Teams, to identify it from other App Id's you might be working with) and the messaging endpoint your register with the Bot Framework will be used in your messaging extension to receive and respond to requests. If you're using an existing registration, make sure you [enable the Microsoft Teams channel](/azure/bot-service/bot-service-manage-channels.md?preserve-view=true&view=azure-bot-service-4.0). - If you follow one of the quickstarts or start from one of the available samples you'll be guided through registering your web service. If you want to manually register your service you have three options to do so. If you choose to register without using an Azure subscription you will not be able to take advantage of the simplified OAuth authentication flow provided by the Bot Framework. You will be able to migrate your registration to Azure after creation. * If you have an Azure subscription (or want to create a new one), you can register your web service manually using the Microsoft Azure portal. Create a "Bot Channels Registration" resource. You can choose the free pricing tier, as messages from Microsoft Teams do not count towards your total allowable messages per month.
platform Faqs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/faqs.md
+
+ Title: Frequently asked questions
+description: Answers to some common questions
+
+ms.localizationpriority: high
+++
+# Moodle FAQ
+
+Get answers to some of your queries when using Moodle LMS.<br>
+
+<br>
+
+<details>
+
+<summary><b>What should I do if one or more of the course teams weren't created after synchronization?</b></summary>
+
+Each Moodle course must have at least one faculty and one student matched to a Microsoft 365 AAD UPN account. The team can't be created, if the synchronization doesn't find a match.
+
+Each team course instance must have an owner, and the synchronization sets the faculty as the owner, with assumption that the faculty has Teams license.
+
+<br>
+
+</details>
+
+<details>
+
+<summary><b>What should we do to remove Moodle login page when working from Teams? Can we force single sign-on (SSO)?</b></summary>
+
+The users have multiple sign in options from the Moodle login page.
+
+* To sign in exclusively using Microsoft 365 credentials enable the **Force redirect** configuration settings for the **auth_oidc plugin**. If the service is enabled, user can see the Microsoft sign in page.
+* To sign in manually to the Moodle portal see [Moodle](https://moodle.org/login/index.php).
+
+<br>
+
+</details>
+
+<details>
+
+<summary><b>How can I specify which users to sync? I donΓÇÖt want all Azure AD users synchronized with the Moodle website. </b></summary>
+
+Use the **User Creation Restriction** option to specify the users by synchronizing the configuration options of the **local_o365** plugin. The dropdown menu to the left of the **filter** offers options such as Country, Company Name, and Language.
+
+> [!TIP]
+> Create a dynamic Microsoft 365 group to enable the **filter** option with multiple profile properties.
+
+The following image shows user creation restrictions options:
+++
+<br>
+
+</details>
+
+<details>
+
+<summary><b>We would like our faculty to be able to synchronize courses to Teams? Are Moodle administrators the only ones who can control synchronization of courses?</b></summary>
+
+By default only Moodle administrators can configure synchronization. The team owner can control if a course is synchronized to Teams and **Allow configure course sync in course** is enabled. In this case, the team owner is the faculty. The block displays the configuration option to individuals with the appropriate owner permissions.
+
+<!-- For more information, see Microsoft 365 block within the Moodle course interface. -->
+
+The following image shows the option **Allow configure course sync in course**:
++
+The following image shows synchronization of courses:
++
+<br>
+
+</details>
+
+<details>
+
+<summary><b>We have followed the documentation, but the user accounts fail to sync AAD and Moodle. What should we do?</b></summary>
+
+The issue can be resolved before users perform the **Delta token clean up** as a final troubleshooting step.
+
+The following table provides the actions and dependencies to be performed and checked:
+
+| Dependency | Action | Reference|
+|-||-|
+| Stable version| Verify that the version of Moodle is listed as a **stable**.| For more information, see [Version support](https://docs.moodle.org/dev/Releases#Version_support).|
+|Permissions| Verify that the Azure application has the necessary permissions to run the synchronization.| For more information, see [Microsoft permissions](https://docs.moodle.org/311/en/Microsoft_365#Permissions).|
+| Full sync| Verify that **Perform a full sync each run** is enabled, and review the **Task Logs** for **Sync users with Azure AD**.| For more information, see [Enable full sync](https://docs.moodle.org/311/en/local_o365)</br>For more information, see [Check task logs](https://docs.moodle.org/311/en/local_o365#Sync_users_with_Azure_AD). |
+|Token refresh|Clean the **User sync delta token** in the local_o365 plugin.| For more information see, [Token refresh](https://docs.moodle.org/38/en/Office365).|
+<!-- |Token refresh|Clean the **User sync delta token** in the local_o365 plugin| {moodle_url}\local_o365\acp.php?Mode=maintenance_cleandeltatoken| -->
+<br>
+
+</details>
+
+<details>
+
+<summary><b>One or more users are unable to sign in using their Microsoft 365 credentials, although most users can sign in without an issue. What would be the cause of this inconsistency?</b></summary>
+
+The reason for inconsistencies with users being able unable to sign using their Microsoft 365 credentials can be related to the user mapping operation during synchronization. To resolve the issue, perform the following steps:
+
+* Check if the Moodle user authentication type is **OpenID**.
+* Check if the Moodle **User Name** matches the AAD username.
+* Clean up the **Token Issue** and retry.
+* Check if the users have **Permissions** to access the Azure application.
+
+<br>
+
+</details>
+
+<details>
+
+<summary><b>All users are unable to sign in using their Microsoft 365 credentials. What can we do to resolve this?</b></summary>
+
+Users who were unable to sign in at the start need to report the issue and verify that the application **Client secret** has not expired.
+
+The following image shows the error message received when user sign using their Microsoft 365 credentials:
++
+The following image shows the error in Azure portal:
++
+If the **Client secret** has expired, then user needs to generate a new **Client secret**, and update the configuration found on page. Users can sign in again after the **Client secret** has been updated, which can take up to 24 hours to re-provision.
+
+<br>
+
+</details>
+
+<details>
+
+<summary><b>How to change the teams instance that is linked to a course?</b></summary>
+
+Administrators can change the teams instance associated with a course through the **Manage Teams Connections** page. Select **Connect** next to the course to be changed and select teams instance. If you use course reset to archive a team, you can link it back to the previous team.
+
+The following image shows the teams instance:
++
+<br>
+
+</details>
+
+<details>
+
+<summary><b>Why isnΓÇÖt the Atto Teams meeting integration showing up within the Atto editor?</b></summary>
+
+The user can face Atto Teams meeting issue if the icon reference is missing in the **Toolbar config**, which displays the Teams icon within the Atto editor. User needs to add Teams meeting icon to the right of the links icon using the following steps:
+
+* Install the plugin.
+* Update **Toolbar config** with **teams meeting**.
+
+The following images show Toolbar icon after Toolbar configuration adjustment:
+++
+For more information on editing Atto toolbar, see:
+
+* [Atto editor-ModdleDocs](https://docs.moodle.org/311/en/Atto_editor)
+* [Atto editor-Icon mapping](https://docs.moodle.org/311/en/Atto_editor#:~:text=in%20the%20editor.-,Atto%20editor%20toolbar,-Atto%20Row%201)
+<br>
+
+</details>
+
+<details>
+
+<summary><b>Do the meetings scheduled through Microsoft integration appear in Outlook or in Teams calendars? What is the standard timeline for the meetings to be displayed?</b></summary>
+
+The meetings scheduled through the app don't appear in the schedulerΓÇÖs Outlook or Teams calendar as they are similar to Channel Meetings. All the members in the course channel can attend the meeting directly from the embedded channel link. For more information, see [Channel meetings](https://www.knowledgewave.com/blog/benefits-of-channel-meetings-in-microsoft-teams).
+
+However, you can access the invite and manually add participant names to the **Required** or **Optional** fields of the meeting invitation to display the remote meeting on their calendars. The standard timelines are based on the date the user specifies when the meeting is created. For more information, see [Limits and specifications for Teams](/microsoftteams/limits-specifications-teams).
+
+<br>
+
+</details>
+
+<details>
+
+<summary><b>Is there any support site where we can get more help on products and other issues?</b></summary>
+
+For support and help on the product and services issues or developer community help see, [Support and Feedback](/microsoftteams/platform/feedback).
++
platform Getting Help https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/getting-help.md
+
+ Title: Get help
+description: Help desk
+
+ms.localizationpriority: high
+++
+# Get help
+
+<!-- Microsoft Teams community of developers use Stack Overflow to connect with other developers to ideate, get clarifications, and submit queries. In addition, users can also use one of websites depending on the type of support required to submit queries, doubts, or clarifications.
+
+The following table provides links to product-specific information, such as issues, limitations, and general questions about Moodle LMS.
+
+|Support type| Contact|
+||--|
+|Microsoft 365 plugins directory| For more information on Microsoft 365 plugins see, [Microsoft 365 plugin](https://moodle.org/plugins/index.php).|
+|Reporting issues related to Microsoft 365 plugins|For more information see [Reporting issues to Microsoft 365 plugins](https://github.com/enovation/moodle-atto_teamsmeeting).
+|Partner apps| Partner apps are supported by the authoring agencies. For more information on publishing the application description website.|
+
+## GitHub issues
+
+The following table provides common GitHub issues and the templates used for resolving the same:
+
+|Issue| Template|
+|--||
+|Issue category| Clarify the plugins and impacted features.|
+|Issue description| Explain the problem, issue, and error messages observed with date and time, and the impact to your organization. Ensure to clarify the desired outcome.|
+|Contact details| Include contact details who can assist and work with support team to resolve the issue, which may require screen sharing.|
+|Priority| Select P1, P2, or P3 to confirm the impact to your organization and the number of users who are blocked. The priority is based on organizational impact.| -->
platform M365 Plugins Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/m365-plugins/m365-plugins-overview.md
+
+ Title: Microsoft 365 plugins
+description: Microsoft 365 plugins details
+
+ms.localizationpriority: high
+++
+# Microsoft 365 plugins
+
+Microsoft 365 plugins provide integration between Moodle website and Teams. These plugins make it easy for user to schedule, deliver, and collaborate the course content. The plugins can be used independently, or in partnership as per the requirement.
+
+## Plugin list and labels
+
+The following table lists the plugins and GitHub labels to be used based on the requirements.
+
+<!--Old content of the table updated and revamped |Plugins to install |Description |GitHub label(s)|
+|--|--|-|
+|[**OpenID Connect**](#openid-connect)|Enable SSO for users who work using both Moodle and Microsoft Teams|auth_oidc|
+|ΓÇó [**OpenID Connect**](#openid-connect) </br> ΓÇó [**Microsoft 365 integration**](#microsoft-365-integration) |Create Teams instances for each course in Moodle, and sync faculty as owners, and students as team members|ΓÇó auth_oidc </br> ΓÇó local_o365|
+|ΓÇó [**OpenID Connect**](#openid-connect) </br> ΓÇó [**Microsoft 365 integration**](#microsoft-365-integration) </br> ΓÇó [**Teams Theme**](#microsoft-365-teams-theme)| Remove Moodle blocks and extra chrome within the Moodle iframes for Teams, which applies while mapping courses to Teams instances | ΓÇó auth_oidc </br> ΓÇó local_o365 </br> ΓÇó themeboost_o365teams |
+|ΓÇó [**OpenID Connect**](#openid-connect) </br> ΓÇó [**Microsoft 365 integration**](#microsoft-365-integration) </br> ΓÇó [**Microsoft 365 Repository**](#microsoft-365-repository) |Leverage Microsoft 365 OneDrive content for file repositories to reduce storage needs in Moodle | ΓÇó auth_oidc </br> * local_o365 </br> ΓÇó repository_office 365|
+|ΓÇó [**OpenID Connect**](#openid-connect) </br> ΓÇó [**OneNote**](#onenote-integration) </br> ΓÇó [**OneNote Submissions**](#onenote-integration) </br> ΓÇó [**OneNote Feedback**](#onenote-integration) | Enable OneNote to be used for assignment, submission and feedback |ΓÇó auth_oidc </br> ΓÇó local_onenote </br> ΓÇó assignsubmission_onenote </br> ΓÇó assignfeedback_onenote |
+|ΓÇó [**OpenID Connect**](#openid-connect) </br> ΓÇó [**Microsoft 365 integration**](#microsoft-365-integration) ΓÇó [**Microsoft 365 Repository**](#microsoft-365-repository) </br> ΓÇó [**Microsoft Block**](#microsoft-365-repository) | Enable 365 quick access blocks within Moodle with links to Microsoft 365 collaboration services and install links for Microsoft Office | ΓÇó auth_oidc </br> ΓÇó local_o365 </br> ΓÇó repository_office365 </br> ΓÇó block_microsoft |
+|[**Teams Meeting**](#teams-meetings) | Enable Atto editor in Moodle to create Teams meeting links |atto_teamsmeeting |
+|[**oEmbed Filter**](#oembed-filter) | Enable video links in Moodle | Filter_oembed| -->
+
+|Plugins to install |Description |GitHub label(s)|
+|--|--|-|
+|[**OpenID Connect**](#openid-connect)|Enables SSO for users who work using both Moodle and Teams.|auth_oidc|
+|[**Microsoft 365 integration**](#microsoft-365-integration)|Create Teams instances for each course in Moodle, and sync faculty as owners, and students as team members.|local_o365|
+|[**Microsoft 365 Repository**](#microsoft-365-repository) |Supports Microsoft 365 OneDrive content for file repositories to reduce storage needs in Moodle.| repository_office 365|
+|[**Teams Meeting**](#teams-meetings) |Enables Atto editor in Moodle to create Teams meeting links.|atto_teamsmeeting |
+|[**Teams Theme**](#microsoft-365-teams-theme)| Remove Moodle blocks and extra chrome within the Moodle iframes for Teams, which applies while mapping courses to Teams instances.| themeboost_o365teams |
+|[**OneNote**](#onenote-integration)| Enable OneNote to be used for assignment, submission, and feedback.|local_onenote, assignsubmission_onenote, and assignfeedback_onenote </br>|
+|[**Microsoft Block**](#microsoft-block) | Enables Microsoft 365 quick access blocks within Moodle with links to Microsoft 365 collaboration services and install links for Microsoft Office.|block_microsoft |
+|[**oEmbed Filter**](#oembed-filter) | Enable video links in Moodle.|Filter_oembed|
+
+Moodle LMS supports the following plugins:
+
+## OpenID Connect
+
+The Open ID Connect plugin allows users to authenticate any website or tool that supports necessary specification and provides single sign-on support (SSO) with Microsoft Office 365. The OpenID Connect plugin provides institutions with the following sign in options to meet their specific requirements:
+
+* Users can enter their Office 365 credentials, such as email and password to sign in directly or sign in using MoodleΓÇÖs username and password fields, without signing into Office 365.
+* Users can select the link to sign in through Office 365 or the OpenID Connect provider on Moodle page.
+
+The following image displays the OpenID connect login page:
++
+## Microsoft 365 integration
+
+Microsoft 365 integration consists of several apps with multiple functionalities, which allows users to stay connected and perform different actions as required. The plugin allows administrators to check the following:
+
+* Check appropriate integration functions.
+* Synchronize users between Office 365 and Moodle.
+* Configure required permissions for users.
+* Set up SharePoint website for the course files.
+
+The following image displays the Microsoft 365 integration setup page:
++
+### User functions
+
+The users can perform the following actions with Microsoft 365 integration:
+
+* Check the overall functioning of all Microsoft 365 plugin integrations.
+* Upload a CSV file, which compares Moodle to Office 365 users.
+* Check configurations for Azure AD permissions.
+
+## Microsoft 365 repository
+
+The Microsoft 365 repository plugin allows users to store course files in OneDrive. Faculty can add files from the course file section of OneDrive or from their own personal space to the repository.
+
+Microsoft 365 repository allows the user to use it as a file repository for an institution while keeping Moodle's data structure simple. The Microsoft 365 repository plugin provides the following
+
+* The faculty can store the course files in OneDrive. Each course has its own folder created in OneDrive, which allows faculty to add files either from the course files area of OneDrive or from their own personal space.
+* To add files to Moodle as a copy or create a link to the file. The linked file is displayed in a new application window or is embedded in the webpage.
+* To upload files to OneDrive or SharePoint using the Moodle file picker.
+
+The following image displays the Microsoft 365 file repository:
++
+## Teams meetings
+
+Teams meetings plugin allows user to create meetings requests in calendar, assignments, forum posts, and also in the Atto editor as per availability.
+
+After the plugin is installed, faculty and students can create an audio or video meeting using Moodle, which requires Microsoft 365 account and Moodle permissions.
+
+>[!NOTE]
+>Teams meetings don't appear on Outlook or Teams calendar, however, individual student names can be added to the invite for the same.
+
+The following image displays the Teams meeting sign in page:
++
+## Microsoft 365 Teams theme
+
+The Microsoft 365 Teams theme plugin provides users with custom view of Moodle course home page and is available for viewing when user accesses their Moodle courses within Teams.
+
+The theme plugin gives users a unified enhanced experience with the following features:
+
+* Adapts to Microsoft Teams theme changes, such as default, dark, and high contrast.
+* Provides focus on the course activities.
+* Removes Moodle blocks, navigation, header, and footer.
+* Provides Microsoft Team User Interface (UI) elements.
+
+The following image displays the Teams theme set up by the user:
++
+## OneNote integration
+
+The OneNote integration plugin provides users with options to browse notebooks, sections, and pages; where assignments are submitted, and faculty provides necessary feedback on corresponding assignments in OneNote. OneNote also enhances user experience by adding features beyond tests and links, while extending the capabilities to mobile using digital pens, photo or video media, and co-authoring with groups.
+
+OneNote integration helps with access to texts, graphics, and audio repositories. The plugin provides the following advantages:
+
+* Include browsing notebooks, sections, and pages, where students work on assignments and provide feedback on those assignments in OneNote.
+* Combine digital binder for notes, assignments, and feedback for reference and review.
+* Expand drafting capabilities beyond text and links, and extend mobile usage using digital pens, photo or video media, and co-authoring with groups.
+* Include submission and feedback page for each assignment under the faculty's account. When such is saved within Moodle, a copy of the HTML and any associated pictures are packaged in a zip file.
+
+> [!NOTE]
+> The submission or feedback events trigger OneNote creation with a section for each course the student has enrolled in.
+
+## Microsoft block
+
+Microsoft block plugin allows the user to access course SharePoint file location and view the course in OneNote notebook for submissions, along with the option to modify Office 365 integration preferences. The administrators can configure the block to appear on all the course pages.
+
+Microsoft block enhances user experience by providing a user interface to modify Microsoft 365 integration features and access to its numerous resources. Administrators can configure the block to view the modified changes to appear on each course page. The block allows the user to perform the following activities:
+
+* Access the course SharePoint file location and OneNote notebook.
+* View the course on OneNote notebook for submissions.
+* Configure the Outlook calendar sync.
+* Manages connection to Office 365.
+* Customize personal Office 365 integration preferences.
+
+The following image shows the Microsoft block user interface:
++
+## oEmbed filter
+
+oEmbed filter plugin simplifies and enhances user experience by simplifying inclusion of the external HTML content within Moodle. The following are the advantages of oEmbed filter.
+
+* Reduces the time to embed videos to an HTML page.
+* Enables embedding of multiple video content providers.
+* Ensures a quicker method to copy and embed code from any of the supported services.
+* Permits video embedding without an API key.
+
+The following image shows inclusion of external HTML content within Moodle:
++
+## See also
+
+* [Partner apps for Moodle](../partner-apps-for-moodle.md)
+* [Moodle FAQ](../faqs.md)
platform Openid Connect https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/m365-plugins/openid-connect.md
+
+ Title: Microsoft 365
+description: Microsoft 365 plugins
+
+ms.localizationpriority: medium
+++
+# Plugins details
+<!-- This document has been merged in m365-plugins overview file
+## OpenID Connect
+
+The Open ID Connect plugin allows you to authenticate any website or tool that supports the required specification and provides single sign-on support (SSO) with Microsoft Office 365. The OpenID Connect plugin provides institutions with the following sign-in workflow options to meet their specific requirements:
+
+* Users can enter their Office 365 credentials, such as email and password to sign in directly or sign-in using MoodleΓÇÖs username and password fields, without signing into Office 365.
+* Users can select the link to sign in through Office 365 or the OpenID Connect provider on Moodle page.
++
+## Microsoft 365 integration
+
+Microsoft 365 consists of several apps with multiple functionalities allowing you to stay connected and perform different actions as required. The Microsoft 365 integration plugin allows administrators to validate the following:
+
+* Validate appropriate integration functions.
+* Synchronize users between Office 365 and Moodle.
+* Configure required permissions for users.
+* Set up SharePoint website for the course files.
++
+### User functions
+
+The users can perform the following actions with Microsoft 365 integration.
+
+* Check the overall functioning of all Microsoft 365 plugin integrations.
+* Upload a CSV file, which compares Moodle to Office 365 users.
+* Validate configurations for Azure AD permissions.
+
+## Microsoft 365 repository
+
+The Microsoft 365 repository plugin allows you to store course files in OneDrive. Faculty can add files from the course file section of OneDrive or from their own personal space to this repository.
+
+Microsoft 365 offers you the benefit of using it as a file repository for an institution while keeping Moodle's data structure simple. The Microsoft 365 repository plugin provides the following
+
+* The faculty can store the course files in OneDrive. Each course has its own folder created in OneDrive, which allows you to add files either from the course files area of OneDrive or from their own personal space.
+* To add files to Moodle as a copy or create a link to the file. The linked file is displayed in a new application window or is embedded in the webpage.
+* To upload files to OneDrive or SharePoint using the Moodle file picker.
++
+## Teams meetings
+
+The Teams meetings plugin allows you to create meetings requests in calendar, assignments, forum posts, and in the Atto editor as per availability.
+
+After the plugin is installed, faculty and students can create an audio or video meeting using Moodle, which requires Microsoft 365 account and Moodle permissions.
+
+>[!NOTE]
+>Teams meetings don't appear on Outlook or Teams calenders, however, individual student names can be added to the invite for the same.
++
+## Microsoft 365 Teams theme
+
+The Microsoft 365 Teams theme plugin provides you with custom view of Moodle course home page and is available for viewing when you access their Moodle courses within Teams.
+
+The theme plugin offers users with an unified enhanced experience with the following features:
+
+* Adapts to Microsoft Teams theme changes, such as default, dark, and high contrast.
+* Provides focus on the course activities.
+* Removes Moodle blocks, navigation, header, and footer.
+* Provides Microsoft Team User Interface (UI) elements.
++
+## OneNote integration
+
+The OneNote integration plugin provides you with options to browse notebooks, sections, and pages; where assignments are submitted and faculty provides necesssary feedback on corresponding assignments in OneNote. OneNote also enhances user experience by adding features beyond tests and links, while extending the capabilities to mobile using digital pens, photo or video media, and co-authoring with groups.
+
+OneNote integration helps with access to texts, graphics, and audio repositories. The plugins provides you with the following advantages:
+
+* Include browsing notebooks, sections, and pages, where students work on assignments and provide feedback on those assignments in OneNote.
+* Combine digital binder for notes, assignments, and feedback for reference and review.
+* Expand drafting capabilities beyond text and links, and extend mobile usage using digital pens, photo or video media, and co-authoring with groups.
+* Include submission and feedback page for each assignment under the faculty's account. When such is saved within Moodle, a copy of the HTML and any associated pictures are packaged in a zip file.
+
+> [!NOTE]
+> The submission or feedback events trigger OneNote creation with a section for each course the student has enrolled in.
+
+## Microsoft block
+
+Microsoft block plugin allows you to access the course SharePoint file location and view the course in OneNote notebook for submissions, along with the option to modify Office 365 integration preferences. The admininstrators can configure the block to appear on all the course pages.
+
+Microsoft block enhances user experience by providing an User Interface (UI) to modify Microsoft 365 integration features and access to its numerous resources. Administators can configure the block to view the modified changes to appear on each course page. The block also allows you to perform the following activities:
+
+* Access the course SharePoint file location and OneNote notebook.
+* View the course on OneNote notebook for submissions.
+* Configure the Outlook calendar sync.
+* Manages connection to Office 365.
+* Customize personal Office 365 integration preferences.
++
+## oEmbed filter
+
+oEmbed filter plugin simplifies and enhances user experience by simplifying inclusion of the external HTML content within Moodle. The following are the advantages of oEmbed filter.
+
+* Reduces the time to embed videos to an HTML page.
+* Enables embedding of multiple video content providers.
+* Ensures a quicker method to copy and embed code from any of the supported services.
+* Permits video embedding without an API key.
++
+## See also
+
+* [Partner apps for Moodle](../partner-apps-for-moodle.md)
+* [Getting help](../getting-help.md))
+* [FAQ](../faqs.md) -->
platform Create Extensions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/messaging-extension-v3/create-extensions.md
The following sections describe how to do this:
[!include[Common content for creating extensions](~/includes/messaging-extensions/messaging-extensions-common.md)]
-### Action type message extensions
+## Action type message extensions
To initiate actions from a messaging extension, set the `type` parameter to `action`. Below is an example of a manifest with a search and a create command. A single messaging extension can have up to 10 different commands. This can include both multiple search and multiple action-based commands.
-#### Complete app manifest example
+### Complete app manifest example
```json {
platform Search Extensions https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/messaging-extension-v3/search-extensions.md
The following sections describe how to do this:
[!include[common content for creating extensions](~/includes/messaging-extensions/messaging-extensions-common.md)]
-### Search type message extensions
+## Search type message extensions
For search based messaging extension set the `type` parameter to `query`. Below is an example of a manifest with a single search command. A single messaging extension can have up to 10 different commands associated with it. This can include both multiple search and multiple Action-based commands.
-#### Complete app manifest example
+### Complete app manifest example
```json {
For search based messaging extension set the `type` parameter to `query`. Below
} ```
-### Test via uploading
+## Test via uploading
You can test your messaging extension by uploading your app.
Most of your work involves the `onQuery` event, which handles all interactions i
If you set `canUpdateConfiguration` to `true` in the manifest, you enable the **Settings** menu item for your messaging extension and must also handle `onQuerySettingsUrl` and `onSettingsUpdate`.
-### Handle onQuery events
+## Handle onQuery events
A messaging extension receives an `onQuery` event when anything happens in the messaging extension window or is sent to the window.
Next, check whether `initialRun` is set; if so, take appropriate action, such as
The remainder of your handler for `onQuery` prompts the user for information, displays a list of preview cards, and returns the card selected by the user.
-### Handle onQuerySettingsUrl and onSettingsUpdate events
+## Handle onQuerySettingsUrl and onSettingsUpdate events
The `onQuerySettingsUrl` and `onSettingsUpdate` events work together to enable the **Settings** menu item.
platform Moodle Lti Apps https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/moodle-lti-apps.md
+
+ Title: Moodle LTI apps
+description: Classification of Moodle LTI apps
+
+ms.localizationpriority: high
+++
+# Moodle LTI apps
+
+Learning Tools Interoperability (LTI) is a specification developed to integrate learning applications with learning management platforms. The following list provides LTI's apps for Moodle LMS:
+
+## OneDrive LTI app
+
+The OneDrive LTI app allows the faculty and students to access their OneDrive files in LMS, which also includes the following:
+
+* Access to class files in shared ODSP libraries from within LMS.
+* Share files using links within LMS.
+
+## Class Teams LTI app
+
+Class Teams LTI app allows faculty and students to easily navigate between Teams and their respective courses in LMS.
+
+Based on the enrolment roster of the LMS course, faculty can do the following:
+
+* Create a class team app with proper user roles for the LMS course.
+* Create a class team app, which adheres to LMS privacy policies and also supports teams administrator.
+
+After creating the Class team app, both faculty and students can do the following:
+
+* Access the team from within the LMS course or Teams.
+* Engage using desktop, mobile, and web platforms.
+
+## Teams Meetings LTI app
+
+The Teams meetings LTI app helps faculty and students to integrate class meetings to their courses and also allows the users to do the following:
+
+* Schedule individual or recurring meetings within the course in LMS and set meeting options.
+* View past and upcoming meetings within LMS course calendar.
+* Join or edit the details of Teams meeting from the LMS course.
+* Engage using desktop and web platforms.
+
+> [!NOTE]
+> The Team Meeting LTI app doesn't support channel meetings, display of meeting recordings, or syncing of meetings with the LMS calendar.
+
+## See also
+
+* [Microsoft 365 plugins](m365-plugins/m365-plugins-overview.md)
+* [Partner apps for Moodle](partner-apps-for-moodle.md)
platform Moodle Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/moodle-overview.md
Title: Moodle learning management system description: Overview of Moodle LMS integration with Teams
+ms.localizationpriority: high
- keywords: moodle LMS mConnect deep links # Moodle learning management system
-Moodle is the worldΓÇÖs largest open source learning management system.
+ Moodle is one of the largest open-source learning managing system (LMS), which provides unique remote learning experience powered with secured privacy services. Moodle LMS integrates with Microsoft Teams to provide the following
-This app helps educators create and organize their courses through valuable features, that include:
-* Robust quizzing tool
-* Graded discussions
-* Various assignment types for students to engage with content
-
-Moodle integrates with Microsoft Teams. Teams is the hub for real-time collaboration, teamwork, and productivity. With seamless integration with Office 365, hundreds of apps, chat, and live meeting capabilities of up to 300 participants. Teams gives faculty and students the ability to work together more efficiently no matter where they are.
-
-Microsoft 365 Moodle plugins complement Moodle by providing a comprehensive experience for faculty and students. With the Microsoft 365 Moodle plugins, site administrators can sync users with:
+* Audio or video calls
+* Chat with students
+* Courses and activity management
+* Badges and rewards
+* Analytical insights
-* Office 365 and Moodle
-* Automate user matching
-* Sync courses to Microsoft Teams and file repositories
-* Connect OneNote assignments
-* Embed Office documents
-
-Microsoft Teams apps such as mConnect by Skooler and the Microsoft 365 Moodle Plugins, integrates Moodle into Teams.
+<!-- [Moodle](https://moodle.com/about/) is the worldΓÇÖs largest open-source learning management system (LMS). With greater than 30 years of experience in remote learning, it has attracted around 300 million users worldwide with its rich set of hosted and cloud-based services. Combining Moodle LMS and Teams provides an enhanced learning experience with modern superpowers.
+This content is modified as per the requirement.-->
-Faculty and students can take advantage of Moodle's unique features in real-time communication and collaboration.
+ The following image demonstrates Moodle LMS:
+ <!-- Query on this image about what is meant by section -->
-## mConnect app by Skooler
-The mConnect app by Skooler allows you to deliver virtual learnings through Teams with ease.
+## Moodle LMS accessibility
-### Why mConnect and Teams
+Moodle LMS helps users access the following apps:
-Watch the following video to understand how mConnect and Teams work better together:
+* **Moodle LTI apps**: The following Learning Tools Interoperability (LTI) apps are available for Moodle LMS:
+ * OneDrive LTI app, which provides services like accessing and sharing personal and class files within LMS.
+ * Class Teams LTI app, which helps faculty to create a class with user roles within the LMS courses. The Class LTI app provides required access to students to various engaging courses.
+ * Teams meetings LTI app, which helps faculty and students to engage using desktop, web platforms, and to integrate class meetings in their LMS course. For more information, see [Moodle LTI apps](moodle-lti-apps.md).
-> [!VIDEO https://www.youtube-nocookie.com/embed/nM56R_woMdE]
+* **Microsoft 365 plugins**: The Microsoft 365 plugins are designed to ensure integration between Moodle sites and Microsoft Teams. These plugins can be used independently, or in partnership to achieve distinct user requirements. For more information, see [Microsoft 365 plugins](m365-plugins/m365-plugins-overview.md).
-From inside mConnect, course participants access the full Moodle course experience inside the real-time collaboration and communication provided by Microsoft Teams.
+* **Partner apps for Moodle**: All the partner set of apps for Moodle and Teams are available in Microsoft Store. For more information see [Partner apps for Moodle](partner-apps-for-moodle.md).
-### Get started with mConnect and Teams
+## User requirement scenarios
-Watch the following video to understand how to get started with mConnect and Teams:
+The following scenarios describe the accelerated learning potential combining Microsoft's cloud services with Moodle's courses:
-> [!VIDEO https://www.youtube-nocookie.com/embed/KOVpQ2s7iA8]
+* **Facilitate hybrid remote meetings**: Teams meetings and extensibility services allows faculty to present in-person and remotely with students. For students it's mandatory to have access to shared views, apps, and polls for remote meetings. The follow-up tasks provides for multi-language transcription and audio or video course recordings. Teams and Moodle work together to share roosters, activities, and tasks.
-For more information, see [mConnect by Skooler](https://skooler.com/mconnect/how-to/).
+* **Personalize meeting panels**: Create unique collaborative learning experiences using Teams Graph API endpoints. For other additional plans or projects, users can interview all new recruits and categorize the results using custom polls. There is facility to share quizzes directly in Teams while pushing updates to the Moodle site asynchronously.
-## Microsoft 365 Moodle Plugins
+* **Automate facility**: To set up automated facilities for institutions when a new student joins, the user can add Moodle course, send an Adaptive Card to the student with relevant links and suggest key reading course materials. Teams custom connector for Moodle helps to create Moodle calendar event each time a course meeting is scheduled.
-Moodle plugins for Teams makes it easy to schedule, deliver, and collaborate on course content. Install the plugins that seamlessly bring the Moodle learning management system into Teams. For more information, see [Install Moodle LMS](moodleInstructions.md).
+* **Build Citizen developer apps**: To develop new custom apps for school, which are easy to create and help optimize learning. The app also provides easy-to-use transactional activities for students and faculty.
+<!-- For more information, see [Microsoft education](https://www.microsoft.com/education).-->
+## See also
+
+* [Microsoft 365 plugins](m365-plugins/m365-plugins-overview.md)
+* [Moodle LTI Apps](moodle-lti-apps.md)
+* [Partner apps for Moodle](partner-apps-for-moodle.md)
+* [Moodle FAQ](faqs.md)
platform Partner Apps For Moodle https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/partner-apps-for-moodle.md
+
+ Title: Partner apps for Moodle
+description: Introduction to partner apps
+
+ms.localizationpriority: high
+++
+# Partner apps for Moodle
+
+Microsoft Store provides all the certified partner apps for Moodle, which validates Softwares as Service (SaaS) offerings. mConnect a partner app for Microsoft integrates Moodle courses with Teams.
+
+## Key benefits of partner apps for Moodle
+
+The following table shows the advantages of using partner apps:
+
+|Advantages| Description|
+|-||
+|Extend Teams to fit your needs| Install and engage with apps designed by experts for improved student engagement and collaboration.|
+|Enjoy single sign-on (SSO)| Enable single sign-on SSO for users of Teams and Moodle to access Moodle courses, data, and activities within Teams.|
+
+## mConnect
+
+The mConnect app integrates Moodle courses and activities into Teams to enhance users learning experience. Skooler, a trusted Microsoft Gold partner in education, has developed the mConnect app and provides the necessary support. mConnect allows Moodle administrators to automatically set up Teams for Moodle course and to make all features available for each course in Moodle.
+
+>[!NOTE]
+>This app is available in Microsoft Store for users who have a pre-existing account with Skooler, and requires administrator access rights to configure it directly from the Moodle site.
+
+<!-- Watch the following video to understand how to get started with mConnect and Teams: -->
+
+<!-- > [!VIDEO unavailable] -->
+
+## See also
+
+* [Moodle FAQ](faqs.md)
+* [Get help](getting-help.md)
+* [Skooler](https://skooler.com/mconnect/how-to/)
platform Removing Tab Margins https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/removing-tab-margins.md
You can build apps that look more native to Teams by removing the margins around
:::image type="content" source="../assets/images/tabs/remove-margins-tabs.png" alt-text="Tab wit and without margins" border="false"::: > [!NOTE]
-> This feature is not applicable to mobile clients, as the tabs viewed in the mobile clients don't have margins.
+> This feature is not applicable to mobile clients, as the tabs viewed in the mobile clients don't have margins.
## Guidelines
No, you must provide your own padding or margins to the left and right of all ap
* Bottom: 0px > [!IMPORTANT]
+>
> * All tabs have their margins removed: personal tabs, (group) chat tabs, meeting tabs, and channel tabs.
-> * The tab margin removal change applies to all tabs. There is no way to opt-in or opt-out of the change.
+> * The tab margin removal change applies to all tabs. There is no way to opt-in or opt-out of the change.
> * Tab margins' change can affect tabs that rely on Microsoft Teams to provide margins surrounding their UI. ## See also
platform Samesite Cookie Update https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/samesite-cookie-update.md
You can opt out of adding the SameSite cookie attribute to the `SetCookie` heade
## SameSite cookie attribute: 2020 release Chrome 80, released in February 2020, introduces new cookie values and imposes cookie policies by default. Three values are passed into the updated SameSite attribute: **Strict**, **Lax**, or **None**. If not specified, cookies SameSite attribute takes the value `SameSite=Lax` by default.
-
+ SameSite cookie attributes are as follows: |Setting | Enforcement | Value |Attribute Specification |
According to the updated SameSite restrictions, a browser does not add a cookie
Android WebView is a Chrome system component that allows Android apps to display the web content. While the new restrictions are default, starting with Chrome 80, they are not immediately enforced on WebViews. They will be applied in the future. To prepare, Android allows native apps to set cookies directly through the [CookieManager API](https://developer.android.com/reference/android/webkit/CookieManager). > [!NOTE]
+>
> * You must declare first party cookies as `SameSite=Lax` or `SameSite=Strict`, as appropriate. > * You must declare third party cookies as `SameSite=None; Secure`.
platform Manifest Schema Dev Preview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/schema/manifest-schema-dev-preview.md
A unique identifier for this app in reverse domain notation; for example, com.ex
## developer
-**Required**
+Required:
Specifies information about your company. For apps submitted to AppSource (formerly Office Store), these values must match the information in your AppSource entry.
Specifies information about your company. For apps submitted to AppSource (forme
## localizationInfo
-**Optional**
+Optional:
Allows the specification of a default language, as well as pointers to additional language files. See [localization](~/concepts/build-and-test/apps-localization.md).
An array of objects specifying additional language translations.
## name
-**Required**
+Required:
The name of your app experience, displayed to users in the Teams experience. For apps submitted to AppSource, these values must match the information in your AppSource entry. The values of `short` and `full` should not be the same.
The name of your app experience, displayed to users in the Teams experience. For
## description
-**Required**
+Required:
Describes your app to users. For apps submitted to AppSource, these values must match the information in your AppSource entry.
Ensure that your description accurately describes your experience and provides i
## icons
-**Required**
+Required:
Icons used within the Teams app. The icon files must be included as part of the upload package.
The value must be a valid HTML color code starting with '#', for example `#4464e
## configurableTabs
-**Optional**
+Optional:
Used when your app experience has a team channel tab experience that requires extra configuration before it is added. Configurable tabs are supported only in the teams scope, and currently only one tab per app is supported.
The object is an array with all elements of the type `object`. This block is req
## staticTabs
-**Optional**
+Optional:
Defines a set of tabs that can be "pinned" by default, without the user adding them manually. Static tabs declared in `personal` scope are always pinned to the app's personal experience. Static tabs declared in the `team` scope are currently not supported.
Render tabs with Adaptive Cards by specifying `contentBotId` instead of `content
The object is an array (maximum of 16 elements) with all elements of the type `object`. This block is required only for solutions that provide a static tab solution. - |Name| Type| Maximum size | Required | Description| |||||| |`entityId`|String|64 characters|Γ£ö|A unique identifier for the entity that the tab displays.|
The object is an array (maximum of 16 elements) with all elements of the type `o
## bots
-**Optional**
+Optional:
Defines a bot solution, along with optional information such as default command properties.
An optional list of commands that your bot can recommend to users. The object is
## connectors
-**Optional**
+Optional:
The `connectors` block defines an Office 365 Connector for the app.
The object is an array (maximum of 1 element) with all elements of type `object`
## composeExtensions
-**Optional**
+Optional:
Defines a messaging extension for the app.
Each command item is an object with the following structure:
## permissions
-**Optional**
+Optional:
An array of `string` which specifies which permissions the app requests, which lets end users know how the extension will perform. The following options are non-exclusive:
The object is an array with all elements of the type `string`.
## webApplicationInfo
-**Optional**
+Optional:
Specify your Microsoft Azure Active Directory (Azure AD) App ID and Graph information to help users seamlessly sign into your Auzre AD app.
You can define any of the following properties:
**Optional** - string Specifies the install scope defined for this app by default. The defined scope will be the option displayed on the button when a user tries to add the app. Options are:+ * `personal` * `team` * `groupchat`
Specifies the install scope defined for this app by default. The defined scope w
**Optional** - object When a group install scope is selected, it will define the default capability when the user installs the app. Options are:+ * `team` * `groupchat` * `meetings`
-
+ |Name| Type| Maximum size | Required | Description| |||||| |`team`|string|||When the install scope selected is `team`, this field specifies the default capability available. Options: `tab`, `bot`, or `connector`.|
platform Team Chat Member Api Changes https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/team-chat-member-api-changes.md
The following code provides a sample JSON representation of what is returned by
"id": "29:1GcS4EyB_oSI8A88XmWBN7NJFyMqe3QGnJdgLfFGkJnVelzRGos0bPbpsfJjcbAD22bmKc4GMbrY2g4JDrrA8vM06X1-cHHle4zOE6U4ttcc", "name": "Anon1 (Guest)", "tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47",
- "userRole": "anonymous"
+ "userRole": "anonymous"
}, { "id": "29:1bSnHZ7Js2STWrgk6ScEErLk1Lp2zQuD5H2qQ960rtvstKp8tKLl-3r8b6DoW0QxZimuTxk_kupZ1DBMpvIQQUAZL-PNj0EORDvRZXy8kvWk", "objectId": "76b0b09f-d410-48fd-993e-84da521a597b",
The following code provides a sample JSON representation of what is returned by
"email": "johnp@fabrikam.com", "userPrincipalName": "johnp@fabrikam.com", "tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47",
- "userRole": "user"
+ "userRole": "user"
}, { "id": "29:1URzNQM1x1PNMr1D7L5_lFe6qF6gEfAbkdG8_BUxOW2mTKryQqEZtBTqDt10-MghkzjYDuUj4KG6nvg5lFAyjOLiGJ4jzhb99WrnI7XKriCs", "objectId": "6b7b3b2a-2c4b-4175-8582-41c9e685c1b5",
The following code provides a sample JSON representation of what is returned by
"email": "Rick.Stevens@fabrikam.com", "userPrincipalName": "rstevens@fabrikam.com", "tenantId":"72f988bf-86f1-41af-91ab-2d7cd011db47",
- "userRole": "user"
+ "userRole": "user"
}] ```
platform Teams Contributor Reference https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/resources/teams-contributor-reference.md
Teams documentation is part of the **Microsoft Docs** technical documentation li
> * Install [Microsoft Visual Studio Code](https://code.visualstudio.com/) (VS Code). > * Install [Docs Authoring Pack](https://marketplace.visualstudio.com/items?itemName=docsmsft.docs-authoring-pack) directly from the VS Code Marketplace. <br>&emsp;&emsp; or- > [!div class="checklist"] > > * Install within VS Code:
Teams documentation is part of the **Microsoft Docs** technical documentation li
## Review the Microsoft Docs Contributors Guide
-The contributors guide provides direction to create, publish, and update technical content on the **Microsoft Docs** platform.
+The contributors guide provides direction to create, publish, and update technical content on the **Microsoft Docs** platform.
## Microsoft Writing, Style, and Content Guides
The contributors guide provides direction to create, publish, and update technic
## File Paths When using relative paths and creating links to other docsets, it is important to set a valid file path for hyperlinks in your documentation. Your build succeeds on GitHub only if the file path is correct or valid.
-
+ For more information on hyperlinks and file paths, see [use links in documentation](/contribute/how-to-write-links). > [!IMPORTANT]
For more information on hyperlinks and file paths, see [use links in documentati
>Ex: **parent directory/directory/path-to-article.md** ΓÇö> [Building an app for Microsoft Teams](../concepts/building-an-app.md) <br><br> > To reference a Microsoft Docs library article that **is not part of** the Teams platform docset:<br> > &emsp;&#x2714; Use a relative path that begins with a forward slash.<br>
-> &emsp;&#x2714; Do not include the file extension. <br>
+> &emsp;&#x2714; Do not include the file extension. <br>
> Ex: **/docset/address-to-file-location** ΓÇö> [Use the Microsoft Graph API to work with Microsoft Teams](/graph/api/resources/teams-api-overview)<br><br> > To reference a page outside of the Microsoft Docs library, such as GitHub, use the full `https` file path.<br>
platform App Templates https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/app-templates.md
New Employee Onboarding is an integrated Microsoft Teams and [SharePoint New Emp
App template code samples are a collection of sample apps for Microsoft Teams platform capabilities. > [!NOTE]
-> Microsoft is not actively managing the source code. The complete source code is open source and you can explore, fork, and modify the source code to meet your specific requirements.
+> * Microsoft is not actively managing the source code. The complete source code is open source and you can explore, fork, and modify the source code to meet your specific requirements.
+> * You must not use Microsoft Power Platform to create apps that are to be published to the Teams app store. Microsoft Power Platform apps can be published to an organizationΓÇÖs app store only.
The following table describes App template code samples:
platform Integrate Web Apps Overview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/integrate-web-apps-overview.md
Low code platforms provide an intuitive approach to software development and req
Microsoft Power platform combines four robust Microsoft technologies, such as Power BI, Power Apps, Power Automate, and Power Virtual Agents in one powerful application platform. These technologies empower you to build solutions, automate processes, analyze data, and create virtual agents within a unified and integrated environment.
+>[!NOTE]
+>You must not use Microsoft Power Platform to create apps that are to be published to the Teams app store. Microsoft Power Platform apps can be published to an organizationΓÇÖs app store only.
+ ### Power Apps With Power Apps, you can build business apps that connect to your business data and are tailored to your organization's needs. Power Apps enable a wide range of app scenarios to solve business challenges through canvas apps. After building the app, you can export it from the Power Apps maker portal and embed in Microsoft Teams.
platform Shifts Wfm Connectors https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/shifts-wfm-connectors.md
Following are the key benefits of Teams Shifts WFM connectors:
* **Seamless integration:** The integration between WFM solutions and Teams Shifts allows first-line workers to use the Teams Shifts app to view or manage their schedules and shift times, and use all the other rich collaboration features provided in Teams right from their mobile device or desktop without having to switch context to another app.
-**Open shifts view in Teams**
+Open shifts view in Teams:
The shifts view in Teams is shown in the following image:
platform Virtual Assistant https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-assistant.md
The following image displays the business functions of Virtual Assistant:
## Create a Teams-focused Virtual Assistant
-Microsoft has published a [Microsoft Visual Studio template](https://marketplace.visualstudio.com/items?itemName=BotBuilder.VirtualAssistantTemplate) for building Virtual Assistants and skills. With the Visual Studio template, you can create a Virtual Assistant, powered by a text based experience with support for limited rich cards with actions. We have enhanced the Visual Studio base template to include Microsoft Teams platform capabilities and power great Teams app experiences. A few of the capabilities include support for rich Adaptive Cards, task modules, teams or group chats, and messaging extensions. For more information on extending Virtual Assistant to Microsoft Teams, see [Tutorial: Extend Your Virtual Assistant to Microsoft Teams](https://microsoft.github.io/botframework-solutions/clients-and-channels/tutorials/enable-teams/1-intro/).
+Microsoft has published a [Microsoft Visual Studio template](https://marketplace.visualstudio.com/items?itemName=BotBuilder.VirtualAssistantTemplate) for building Virtual Assistants and skills. With the Visual Studio template, you can create a Virtual Assistant, powered by a text based experience with support for limited rich cards with actions. We have enhanced the Visual Studio base template to include Microsoft Teams platform capabilities and power great Teams app experiences. A few of the capabilities include support for rich Adaptive Cards, task modules, teams or group chats, and messaging extensions. For more information on extending Virtual Assistant to Microsoft Teams, see [Tutorial: Extend Your Virtual Assistant to Microsoft Teams](https://microsoft.github.io/botframework-solutions/clients-and-channels/tutorials/enable-teams/1-intro/).
The following image displays the high level diagram of a Virtual Assistant solution: ![High-level diagram of a Virtual Assistant solution](../assets/images/bots/virtual-assistant/high-level-diagram.png)
This drawback is resolved by embedding skill information in the card action payl
You must provide `skillId` in the constructor to ensure that the skill information is always present in card actions. A card action data sample code is shown in the following section:+ ```csharp public class CardActionData {
Virtual Assistant can handle interruptions in cases where a user tries to invoke
### Handle task module requests
-To add task module capabilities to a Virtual Assistant, two additional methods are included in the Virtual Assistant activity handler: `OnTeamsTaskModuleFetchAsync` and `OnTeamsTaskModuleSubmitAsync`. These methods listen to task module-related activities from Virtual Assistant, identify the skill associated with the request, and forward the request to the identified skill.
+To add task module capabilities to a Virtual Assistant, two additional methods are included in the Virtual Assistant activity handler: `OnTeamsTaskModuleFetchAsync` and `OnTeamsTaskModuleSubmitAsync`. These methods listen to task module-related activities from Virtual Assistant, identify the skill associated with the request, and forward the request to the identified skill.
Request forwarding is done through the [SkillHttpClient](/dotnet/api/microsoft.bot.builder.integration.aspnet.core.skills.skillhttpclient?view=botbuilder-dotnet-stable&preserve-view=true), `PostActivityAsync` method. It returns the response as `InvokeResponse` which is parsed and converted to `TaskModuleResponse` . - ```csharp public static TaskModuleResponse GetTaskModuleRespose(this InvokeResponse invokeResponse) {
Request forwarding is done through the [SkillHttpClient](/dotnet/api/microsoft.b
} ```
-A similar approach is followed for card action dispatching and task module responses. Task module fetch and submit action data is updated to include `skillId`.
+A similar approach is followed for card action dispatching and task module responses. Task module fetch and submit action data is updated to include `skillId`.
Activity Extension method `GetSkillId` extracts `skillId` from the payload which provides details about the skill that needs to be invoked. The code snippet for `OnTeamsTaskModuleFetchAsync` and `OnTeamsTaskModuleSubmitAsync` methods are given in the following section:
Some messaging extension activities do not include the command ID. For example,
## Example The following example shows how to convert the Book-a-room app template to a Virtual Assistant skill:
-Book-a-room is a Microsoft Teams that allows users quickly to find and reserve a meeting room for 30, 60, or 90 minutes starting from the current time. The default time is 30 minutes. The Book-a-room bot scopes to personal or 1:1 conversations.
+Book-a-room is a Microsoft Teams that allows users quickly to find and reserve a meeting room for 30, 60, or 90 minutes starting from the current time. The default time is 30 minutes. The Book-a-room bot scopes to personal or 1:1 conversations.
The following image displays a Virtual Assistant with a **book a room** skill: ![Virtual Assistant with a "book a room" skill](../assets/images/bots/virtual-assistant/book-a-room-skill.png)
bf luis:convert --in <pathToLUIS.json> --out <pathToLuFile>
Book-a-room bot has two main commands for users: -- `Book room`-- `Manage Favorites`
+* `Book room`
+* `Manage Favorites`
We have built a LUIS model by understanding these two commands. Corresponding secrets must be populated in `cognitivemodels.json`. The corresponding LUIS JSON file is found [here](https://github.com/OfficeDev/microsoft-teams-apps-bookaroom/blob/nebhagat/microsoft-teams-apps-bookaroom-skill/Deployment/Resources/LU/en-us/book-a-meeting.json). The corresponding `.lu` file is shown in the following section:
The allowed callers array can restrict which skill consumers can access the skil
For more information on adding claims validation to a skill, see [add claims validation to skill](/azure/bot-service/skill-implement-skill?view=azure-bot-service-4.0&tabs=cs#claims-validator&preserve-view=true).
-### Limitation of card refresh
+### Limitation of card refresh
Updating activity, such as card refresh is not supported yet through Virtual Assistant ([github issue](https://github.com/microsoft/botbuilder-dotnet/issues/3686)). Hence, we have replaced all card refresh calls `UpdateActivityAsync` with posting new card calls `SendActivityAsync`. ### Card actions and task module flows To forward card action or task module activities to an associated skill, the skill must embed `skillId` to it.
-`Book-a-room` bot card action, task module fetch and submit action payloads are modified to contain `skillId` as a parameter.
+`Book-a-room` bot card action, task module fetch and submit action payloads are modified to contain `skillId` as a parameter.
For more information refer [this](/microsoftteams/platform/samples/virtual-assistant#add-adaptive-cards-to-your-virtual-assistant) section from this documentation.
For more information refer [this](/microsoftteams/platform/samples/virtual-assis
You can also leverage existing skills from [Bot Framework Solutions repository](https://github.com/microsoft/botframework-components/tree/main/skills/csharp) or create a new skill altogether from scratch. For creating a new skill, see [tutorials to create a new skill](https://microsoft.github.io/botframework-solutions/overview/skills/). For Virtual Assistant and skills architecture documentation, see[Virtual Assistant and skills architecture](/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0&preserve-view=true).
-## Limitations of Virtual Assistant
+## Limitations of Virtual Assistant
* **EndOfConversation**: A skill must send an `endOfConversation` activity when it finishes a conversation. Based on the activity, a Virtual Assistant ends context with that particular skill and gets back into Virtual Assistant's root context. For Book-a-room bot, there is no clear state where conversation is ended. Hence we have not sent `endOfConversation` from `Book-a-room` bot and when user wants to go back to root context they can simply do that by `start over` command. * **Card refresh**: Card refresh is not yet supported through Virtual Assistant.
You can also leverage existing skills from [Bot Framework Solutions repository](
| Updated visual studio template | Customized template to support teams capabilities. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-virtual-assistant/csharp) | | Book-a-room bot skill code | Lets you quickly find and book a meeting room on the go. | [View](https://github.com/OfficeDev/microsoft-teams-apps-bookaroom/tree/nebhagat/microsoft-teams-apps-bookaroom-skill) | - ## See also * [Integrate web apps](~/samples/integrate-web-apps-overview.md)
platform Tabs Mobile https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/design/tabs-mobile.md
Apps [distributed through the Teams store](~/concepts/deploy-and-publish/appsour
| **Channel and group tabs** | The tab opens in the Teams client using `contentUrl`. | The tab opens in a browser outside the Teams client using `websiteUrl`. | > [!NOTE]
+>
> * Apps submitted to the [AppSource](https://appsource.microsoft.com) for publishing on Teams are evaluated automatically for mobile responsiveness. For any queries, reach out to teamsubm@microsoft.com. > * For all apps that are not distributed through the AppSource, the tabs open in an in-app webview within the Teams clients by default and there is no separate approval process required. > * The default behavior of apps is only applicable if distributed through the Teams store. By default, all tabs open in the Teams client.
platform Build Adaptive Card Tabs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/build-adaptive-card-tabs.md
keywords: adaptive card personal app authentication data flow
# Build tabs with Adaptive Cards > [!IMPORTANT]
+>
> * Tabs with Adaptive Cards are currently only supported as personal apps. When developing a tab using the traditional method, you might run into these issues:
Following is a sample Adaptive Card tab manifest:
Communication between your Adaptive Card tab and your bot is done through `invoke` activities. Each `invoke` activity has a corresponding **name**. Use the name of each activity to differentiate each request. `tab/fetch` and `tab/submit` are the activities covered in this section. > [!NOTE]
+>
> * Bots need to send all the responses to [service URL](/azure/bot-service/rest-api/bot-framework-rest-connector-api-reference?view=azure-bot-service-4.0#base-uri&preserve-view=true). Service URL is received as part of incoming `activity` payload. > * The invoke payload size has increased to 80kb.
With the introduction of Adaptive Card tab, there's a change in how the bot resp
The following code provides examples of `task/fetch` request and response: **`task/fetch` request**+ ```json // task/fetch POST request: agents/{botId}/invoke {
The following code shows a reissued request example:
* [Create a personal tab](~/tabs/how-to/create-personal-tab.md) * [Create a channel or group tab](~/tabs/how-to/create-channel-group-tab.md) * [Tabs on mobile](~/tabs/design/tabs-mobile.md)
-* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
+* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
platform Conversational Tabs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/conversational-tabs.md
microsoftTeams.conversations.onCloseConversation = (conversationResponse) => {
| Sample name | Description | C# |Node.js| |-|-||-|
-|Create Conversational tab| Microsoft Teams tab sample app for demonstrating create conversation tab. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-conversations/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-conversations/nodejs) |
+|Create Conversational tab| Microsoft Teams tab sample app for demonstrating create conversation tab. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-conversations/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-conversations/nodejs) |
## Next step
platform Removal Page https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/how-to/create-tab-pages/removal-page.md
When a user selects **Remove** from the tab's drop-down menu, Teams loads the op
After the remove handler is executed, `removeEvent.notifySuccess()` or `removeEvent.notifyFailure()` notifies Teams of the content removal outcome. >[!NOTE]
+>
> * To ensure that an authorized user's control over a tab is not inhibited, Teams removes the tab in both success and failure cases.
-> * After you invoke the `registerOnRemoveHandler` event handler, you'll have 15 seconds to respond to the method. By default, Teams enables the **Remove** button after five seconds even if you don't call `setValidityState(true)`.
+> * After you invoke the `registerOnRemoveHandler` event handler, you'll have 15 seconds to respond to the method. By default, Teams enables the **Remove** button after five seconds even if you don't call `setValidityState(true)`.
> * When the user selects **Remove**, Teams removes the tab after 30 seconds regardless of whether the actions have been completed or not. ## Next step
platform Tabs Link Unfurling https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/tabs/tabs-link-unfurling.md
ms.localizationpriority: none
# Tabs link unfurling and Stage View Stage View is a new user interface (UI) component, which allows you to render the content that is opened in full screen in Teams and pinned as a tab.
-
+ ## Stage View Stage View is a full screen UI component that you can invoke to surface your web content. The existing link unfurling service is updated so that it is used to turn URLs into a tab using an Adaptive Card and Chat Services. When a user sends a URL in a chat or channel, the URL is unfurled to an Adaptive Card. The user can select **View** in the card, and pin the content as a tab directly from Stage View.
The following images display a stage opened from an Adaptive Card:
[![Open a stage from Adaptive Card](~/assets/images/tab-images/open-stage-from-adaptive-card1.png)](~/assets/images/tab-images/open-stage-from-adaptive-card1.png#lightbox)
-[![Open a stage](~/assets/images/tab-images/open-stage-from-adaptive-card2.png)](~/assets/images/tab-images/open-stage-from-adaptive-card2.png#lightbox)
+[![Open a stage](~/assets/images/tab-images/open-stage-from-adaptive-card2.png)](~/assets/images/tab-images/open-stage-from-adaptive-card2.png#lightbox)
### Example
Following is the code to open a stage from an Adaptive Card:
The `invoke` request type must be `composeExtension/queryLink`. > [!NOTE]
-> * `invoke` workflow is similar to the current `appLinking` workflow.
+>
+> * `invoke` workflow is similar to the current `appLinking` workflow.
> * To maintain consistency, it is recommended to name `Action.Submit` as `View`. > * `websiteUrl` is a required property to be passed in the `TabInfo` object.
To invoke the Stage View through deep link from your tab, you must wrap the deep
### Syntax
-Following is the deeplink syntax:
+Following is the deeplink syntax:
https://teams.microsoft.com/l/stage/{appId}/0?context={"contentUrl":"contentUrl","websiteUrl":"websiteUrl","name":"Contoso"}
Following are the deep link examples to invoke Stage View:
**Example 1: URL with threadId** Unencoded URL:
-
+ https://teams.microsoft.com/l/stage/be411542-2bd5-46fb-8deb-a3d5f85156f6/0?context={"contentUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191","websiteUrl":"https://teams-alb.wakelet.com/teams/collection/e4173826-5dae-4de0-b77d-bfabafd6f191?standalone=true","title":"Quotes:Miscellaneous","threadId":"19:9UryYW9rjwnq-vwmBcexGjN1zQSNX0Y4oEAgtUC7WI81@thread.tacv2"} Encoded URL: https://teams.microsoft.com/l/stage/be411542-2bd5-46fb-8deb-a3d5f85156f6/0?context=%7B%22contentUrl%22%3A%22https%3A%2F%2Fteams-alb.wakelet.com%2Fteams%2Fcollection%2Fe4173826-5dae-4de0-b77d-bfabafd6f191%22%2C%22websiteUrl%22%3A%22https%3A%2F%2Fteams-alb.wakelet.com%2Fteams%2Fcollection%2Fe4173826-5dae-4de0-b77d-bfabafd6f191%3Fstandalone%3Dtrue%22%2C%22title%22%3A%22Quotes%3A%20Miscellaneous%22%2C%22threadId%22%3A%2219:9UryYW9rjwnq-vwmBcexGjN1zQSNX0Y4oEAgtUC7WI81@thread.tacv2%22%7D - **Example 2: URL with no threadId** Unencoded URL:
Encoded
https://teams.microsoft.com/l/stage/43f56af0-8615-49e6-9635-7bea3b5802c2/0?context=%7B%22contentUrl%22%3A%22https%3A%2F%2Fteams-alb.wakelet.com%2Fteams%2Fcollection%2Fe4173826-5dae-4de0-b77d-bfabafd6f191%22%2C%22websiteUrl%22%3A%22https%3A%2F%2Fteams-alb.wakelet.com%2Fteams%2Fcollection%2Fe4173826-5dae-4de0-b77d-bfabafd6f191%3Fstandalone%3Dtrue%22%2C%22title%22%3A%22Quotes%3A%20Miscellaneous%22%7D - > [!NOTE] > All deeplinks must be encoded before pasting the URL. We don't support unencoded URLs.
+>
> * The `name` is optional in deep link. If not included, the app name replaces it. > * The deep link can also be passed through an `OpenURL` action. > * When you launch a Stage from a certain context, ensure that your app works in that context. For example, if your Stage View is launched from a personal app, you must ensure your app has a personal scope.
https://teams.microsoft.com/l/stage/43f56af0-8615-49e6-9635-7bea3b5802c2/0?conte
| Sample name | Description | C# |Node.js| |-|-||-| |Tab in stage view |Microsoft Teams tab sample app for demonstrating tab in stage view.|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-stage-view/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/tab-stage-view/nodejs)|
-
## Next step
platform Sequential Workflows https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/Universal-actions-for-adaptive-cards/Sequential-Workflows.md
var adaptiveCardResponse = JObject.FromObject(new
| Teams catering bot | Create a bot that accepts food order using Adaptive Cards. |[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-teams-catering/csharp)| Not yet available | | Sequential Workflows Adaptive Cards | Demonstrate how to implement Sequential Workflows, User Specific Views, and up to date Adaptive Cards in bots. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-sequential-flow-adaptive-cards/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-sequential-flow-adaptive-cards/nodejs) | - ## See also * [Adaptive Card actions in Teams](~/task-modules-and-cards/cards/cards-actions.md#adaptive-cards-actions) * [How bots work](/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&preserve-view=true) * [Work with Universal Actions for Adaptive Cards](Work-with-universal-actions-for-adaptive-cards.md)
-* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
+* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
platform Up To Date Views https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/Universal-actions-for-adaptive-cards/Up-To-Date-Views.md
Following are the two roles that are shown to users depending on the approval re
* Approval base card: Shown to users not part of approvers list and the request is not yet approved or rejected, and not part of `userIds` list in `refresh` property of the Adaptive Card JSON. * Approval card with **Approve** or **Reject** buttons: Shown to the users who are part of the approvers list and the `userIds` list in the `refresh` property of the Adaptive Card JSON.
-**To send the asset approval request**
+To send the asset approval request:
1. Alex raises an asset approval request in a Teams conversation and assigns it to Megan and Nestor. 2. Bot sends the approval base card in the conversation.
The following code provides an example of Adaptive Cards sent as response of `ad
* [Work with Universal Actions for Adaptive Cards](Work-with-universal-actions-for-adaptive-cards.md) * [User Specific Views](User-Specific-Views.md)
-* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
+* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
platform User Specific Views https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/Universal-actions-for-adaptive-cards/User-Specific-Views.md
The following code provides an example of Adaptive Cards:
} ```
-**To send Adaptive Cards, refresh User Specific Views, and invoke requests to the bot**
+To send Adaptive Cards, refresh User Specific Views, and invoke requests to the bot:
1. When Megan creates a new incident, the bot sends the Adaptive Card or common card with incident details in the Teams conversation. 2. Now this card automatically refreshes to User Specific View for Megan and Alex. Alex's and Megan's user MRIs are added in `userIds` property of `refresh` property of the Adaptive Card JSON. The card remains the same for other users in the conversation.
const cardRes = {
``` -
+***
Card design guidelines to keep in mind while designing User Specific Views:
platform Work With Universal Actions For Adaptive Cards https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/Universal-actions-for-adaptive-cards/Work-with-Universal-Actions-for-Adaptive-Cards.md
For more information, see [backward compatibility on Teams](/adaptive-cards/auth
* [How bots work](/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0&preserve-view=true) * [Sequential Workflows](~/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/sequential-workflows.md) * [Up to date cards](~/task-modules-and-cards/cards/universal-actions-for-adaptive-cards/up-to-date-views.md)
-* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
+* [Form completion feedback](~/bots/how-to/conversations/conversation-messages.md#form-completion-feedback)
platform Dynamic Search https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/dynamic-search.md
The following properties are the new additions to the [`Input.ChoiceSet`](https:
| Property| Type | Required | Description | |--||-|-|
-| type | Data.Query | Yes | Specifies that it's a Data.Query object.|
+| type | Data.Query | Yes | Specifies that it's a Data.Query object.|
| dataset | String | Yes | Specifies the type of data that is fetched dynamically. |
-| value | String | No | Populates for the invoke request to the bot with the input that the user provided to the `ChoiceSet`. |
-| count | Number | No | Populates for the invoke request to the bot to specify the number of elements that must be returned. The bot ignores it, if the users want to send a different amount. |
+| value | String | No | Populates for the invoke request to the bot with the input that the user provided to the `ChoiceSet`. |
+| count | Number | No | Populates for the invoke request to the bot to specify the number of elements that must be returned. The bot ignores it, if the users want to send a different amount. |
| skip | Number | No | Populates for the invoke request to the bot to indicate that users want to paginate and move ahead in the list. | ### Example
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext
{ if (turnContext.Activity.Name == "application/search") {
- var packages = new[] {
- new { title = "A very extensive set of extension methods", value = "FluentAssertions" },
- new { title = "Fluent UI Library", value = "FluentUI" }};
-
- var searchResponseData = new
- {
- type = "application/vnd.microsoft.search.searchResponse",
- value = new
- {
- results = packages
- }
- };
- var jsonString = JsonConvert.SerializeObject(searchResponseData);
- JObject jsonData = JObject.Parse(jsonString);
- return new InvokeResponse()
- {
- Status = 200,
- Body = jsonData
- };
+ var packages = new[] {
+ new { title = "A very extensive set of extension methods", value = "FluentAssertions" },
+ new { title = "Fluent UI Library", value = "FluentUI" }};
+
+ var searchResponseData = new
+ {
+ type = "application/vnd.microsoft.search.searchResponse",
+ value = new
+ {
+ results = packages
+ }
+ };
+ var jsonString = JsonConvert.SerializeObject(searchResponseData);
+ JObject jsonData = JObject.Parse(jsonString);
+ return new InvokeResponse()
+ {
+ Status = 200,
+ Body = jsonData
+ };
} return null;
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext
``` #### [Node.js](#tab/nodejs)
-
+ ```nodejs async onInvokeActivity(context) { if (context._activity.name == 'application/search') {
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext
} ```
-#### [JSON](#tab/json)
+#### [JSON](#tab/json)
```json {
protected override async Task<InvokeResponse> OnInvokeActivityAsync(ITurnContext
|-|--|--|-| | Typeahead search control on Adaptive Cards | The sample shows the features of static and dynamic typeahead search control in Adaptive Cards. | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-type-ahead-search-adaptive-cards/csharp) | [View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-type-ahead-search-adaptive-cards/nodejs) | - ## See also * [Universal Actions for Adaptive Cards](Universal-actions-for-adaptive-cards/Overview.md)
platform People Picker https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/cards/people-picker.md
>[!NOTE] > Currently, People Picker in Adaptive Cards is available in [public developer preview](../../resources/dev-preview/developer-preview-intro.md#public-developer-preview-for-microsoft-teams) only for mobile and generally available (GA) for desktop.
-People Picker helps users to search and select users in Adaptive Card. You can add People Picker as input control to Adaptive Card, which works across chats, channels, task modules, and tabs. People Picker supports the following features:
+People Picker helps users to search and select users in Adaptive Card. You can add People Picker as input control to Adaptive Card, which works across chats, channels, task modules, and tabs. People Picker supports the following features:
* Searches single or multiple users.
-* Selects single or multiple users.
-* Reassigns to single or multiple users.
+* Selects single or multiple users.
+* Reassigns to single or multiple users.
* Prepopulates the name of selected users.
-## Popular scenarios
+## Popular scenarios
The following table provides popular scenarios for People Picker in Adaptive Cards and the corresponding actions: |Scenarios|Actions| |-|-| |Approval-based scenarios| To request, assign, and reassign the approval to the intended user based on the requirement.|
-|Incident management| To track incidents and notify, assign, and reassign to the intended user for immediate action.|
+|Incident management| To track incidents and notify, assign, and reassign to the intended user for immediate action.|
|Project management| To assign tickets or bugs to particular users.| |User lookup| To search for users across the organization.|
The web and desktop client support People Picker in Adaptive Card. While searchi
### Reassignment scenario example
-User A (Robert) receives a ticket for a task in a channel and realizes incorrect assignee. User A reassigns the task that sends the information back to the bot.
+User A (Robert) receives a ticket for a task in a channel and realizes incorrect assignee. User A reassigns the task that sends the information back to the bot.
-**To reassign any task**
+To reassign any task:
1. Select **Reassign** where the people picker field is prepopulated with name to reassign the task to the intended user.
-1. Remove the incorrect user's name.
-1. Select intended users as per the image scenario, user B (Mona), and user C (Robin) for the task.
-1. Select **Assign**. After assigning, the information is sent to the bot.
- The bot updates Adaptive Card and notifies the intended users.
-
-The following image shows the reassignment scenario:
+1. Remove the incorrect user's name.
+1. Select intended users as per the image scenario, user B (Mona), and user C (Robin) for the task.
+1. Select **Assign**. After assigning, the information is sent to the bot.
+ The bot updates Adaptive Card and notifies the intended users.
+
+The following image shows the reassignment scenario:
![People Picker on Desktop](../../assets/images/cards/desktoppp.gif)
Android and iOS mobile clients support People Picker in Adaptive Cards. You can
### Reassignment scenario example
-User A (Robert) receives a ticket for a task in a channel and realizes incorrect assignee. User A reassigns the task that sends the information back to the bot.
+User A (Robert) receives a ticket for a task in a channel and realizes incorrect assignee. User A reassigns the task that sends the information back to the bot.
-**To reassign any task**
+To reassign any task:
1. Select **Reassign** where the people picker field is prepopulated with name to reassign the task to the intended user. 1. Remove the incorrect user's name. 1. Select intended users as per the image scenario, user B (Mona), and user C (Robin) for the task. 1. Select **Done**.
-1. Select **Assign**. After assigning, the information is sent to the bot.
- The bot updates Adaptive Card and notifies the intended users.
+1. Select **Assign**. After assigning, the information is sent to the bot.
+ The bot updates Adaptive Card and notifies the intended users.
-The following image shows the reassignment scenario:
+The following image shows the reassignment scenario:
![People Picker on Mobile](../../assets/images/cards/mobilepp.gif)
The following image shows the reassignment scenario:
## Implement People Picker
-People Picker is implemented as an extension of the [Input.ChoiceSet](https://adaptivecards.io/explorer/Input.ChoiceSet.html) control. The input control includes the following selections:
+People Picker is implemented as an extension of the [Input.ChoiceSet](https://adaptivecards.io/explorer/Input.ChoiceSet.html) control. The input control includes the following selections:
* Dropdown, such as an expanded selection. * Radio button, such as a single selection.
The following properties are additions to the `Input.ChoiceSet` schema to enable
|Property |Type |Required |Description| |--|--|--|--|
-|**dataset** |String |Yes |The type of data that must be fetched dynamically.|
+|**dataset** |String |Yes |The type of data that must be fetched dynamically.|
#### dataset
-The following table provides predefined values as **dataset** for people picker:
+
+The following table provides predefined values as **dataset** for people picker:
|dataset|Search Scope |--|--| |**graph.microsoft.com/users** |Search all members across the organization.|
-|**graph.microsoft.com/users?scope=currentContext** |Search within the members of the current conversation, such as chat or channel in which the particular card is sent.|
+|**graph.microsoft.com/users?scope=currentContext** |Search within the members of the current conversation, such as chat or channel in which the particular card is sent.|
### Example+ The code example for creating People Picker with organization search is as follows:
-```json
+```json
{
- "type": "AdaptiveCard",
- "body": [
- {
- "type": "TextBlock",
- "size": "Medium",
- "weight": "Bolder",
- "text": "People Picker with Org search enabled"
- },
- {
- "type": "Input.ChoiceSet",
- "choices": [],
- "choices.data": {
- "type": "Data.Query",
- "dataset": "graph.microsoft.com/users"
- },
- "id": "people-picker",
- "isMultiSelect": true
- }
- ],
- "actions": [
- {
- "type": "Action.Submit",
- "title": "Submit"
- }
- ],
- "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
- "version": "1.2"
+ "type": "AdaptiveCard",
+ "body": [
+ {
+ "type": "TextBlock",
+ "size": "Medium",
+ "weight": "Bolder",
+ "text": "People Picker with Org search enabled"
+ },
+ {
+ "type": "Input.ChoiceSet",
+ "choices": [],
+ "choices.data": {
+ "type": "Data.Query",
+ "dataset": "graph.microsoft.com/users"
+ },
+ "id": "people-picker",
+ "isMultiSelect": true
+ }
+ ],
+ "actions": [
+ {
+ "type": "Action.Submit",
+ "title": "Submit"
+ }
+ ],
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "version": "1.2"
} ```
The format of the value submitted to the bot depends on the value of the `isMult
|false _(single select)_|<selected_Azure_AD_ID>| |true _(multi select)_|<selected_Azure_AD_ID_1>,<selected_Azure_AD_ID_2>,<selected_Azure_AD_ID_3>|
-With the `Azure AD ID`, People Picker preselects the corresponding user.
+With the `Azure AD ID`, People Picker preselects the corresponding user.
## Preselection of user People Picker supports preselection of user in the control, when creating and sending an Adaptive Card. `Input.ChoiceSet` supports the `value` property that is used to preselect a user. The format of this `value` property is the same as the submitted value format in [data submission](#data-submission). The following list provides the information to preselect users:
-* For single user in the control, specify the `Azure AD ID` of the user as the `value`.
+* For single user in the control, specify the `Azure AD ID` of the user as the `value`.
* For multiple users, such as `isMultiSelect` is `true`, specify a comma-separated string of `Azure AD ID`s. The following example describes preselection of a single user: ```json {
- "type": "AdaptiveCard",
- "body": [
- {
- "type": "TextBlock",
- "size": "Medium",
- "weight": "Bolder",
- "text": "People Picker with Org search enabled"
- },
- {
- "type": "Input.ChoiceSet",
- "choices": [],
- "choices.data": {
- "type": "Data.Query",
- "dataset": "graph.microsoft.com/users"
- },
- "id": "people-picker",
- "value": "<Azure AD ID 1>"
- }
- ],
- "actions": [
- {
- "type": "Action.Submit",
- "title": "Submit"
- }
- ],
- "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
- "version": "1.2"
+ "type": "AdaptiveCard",
+ "body": [
+ {
+ "type": "TextBlock",
+ "size": "Medium",
+ "weight": "Bolder",
+ "text": "People Picker with Org search enabled"
+ },
+ {
+ "type": "Input.ChoiceSet",
+ "choices": [],
+ "choices.data": {
+ "type": "Data.Query",
+ "dataset": "graph.microsoft.com/users"
+ },
+ "id": "people-picker",
+ "value": "<Azure AD ID 1>"
+ }
+ ],
+ "actions": [
+ {
+ "type": "Action.Submit",
+ "title": "Submit"
+ }
+ ],
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "version": "1.2"
} ```
The following example describes preselection of multiple users:
```json {
- "type": "AdaptiveCard",
- "body": [
- {
- "type": "TextBlock",
- "size": "Medium",
- "weight": "Bolder",
- "text": "People Picker with Org search enabled"
- },
- {
- "type": "Input.ChoiceSet",
- "choices": [],
- "choices.data": {
- "type": "Data.Query",
- "dataset": "graph.microsoft.com/users"
- },
- "id": "people-picker",
- "isMultiSelect": true,
- "value": "<Azure AD ID 1>,<Azure AD ID 2>,<Azure AD ID 3>"
- }
- ],
- "actions": [
- {
- "type": "Action.Submit",
- "title": "Submit"
- }
- ],
- "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
- "version": "1.2"
+ "type": "AdaptiveCard",
+ "body": [
+ {
+ "type": "TextBlock",
+ "size": "Medium",
+ "weight": "Bolder",
+ "text": "People Picker with Org search enabled"
+ },
+ {
+ "type": "Input.ChoiceSet",
+ "choices": [],
+ "choices.data": {
+ "type": "Data.Query",
+ "dataset": "graph.microsoft.com/users"
+ },
+ "id": "people-picker",
+ "isMultiSelect": true,
+ "value": "<Azure AD ID 1>,<Azure AD ID 2>,<Azure AD ID 3>"
+ }
+ ],
+ "actions": [
+ {
+ "type": "Action.Submit",
+ "title": "Submit"
+ }
+ ],
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "version": "1.2"
} ```
-
+ ## Static choices The static choices support scenarios where custom profiles must be inserted into the predefined datasets. `Input.ChoiceSet` supports specifying `choices` statically in the json. The static choice is used to create the choices from which the user can select. > [!NOTE]
-> Static `choices` are used with dynamic datasets.
+> Static `choices` are used with dynamic datasets.
-The choice consists of `title` and `value`. When used along with People Picker, these choices are translated to user profiles that have the `title` as the name and the `value` as the identifier. These custom profiles are also part of the search results when the search query matches the given `title`.
-The following example describes static choices:
+The choice consists of `title` and `value`. When used along with People Picker, these choices are translated to user profiles that have the `title` as the name and the `value` as the identifier. These custom profiles are also part of the search results when the search query matches the given `title`.
+The following example describes static choices:
```json {
- "type": "AdaptiveCard",
- "body": [
- {
- "type": "TextBlock",
- "size": "Medium",
- "weight": "Bolder",
- "text": "People Picker with Org search enabled"
- },
- {
- "type": "Input.ChoiceSet",
- "choices": [
- {
- "title": "Custom Profile 1",
- "value": "Profile1"
- },
- {
- "title": "Custom Profile 2",
- "value": "Profile2"
- }
- ],
- "choices.data": {
- "type": "Data.Query",
- "dataset": "graph.microsoft.com/users"
- },
- "id": "people-picker",
- "isMultiSelect": true
- }
- ],
- "actions": [
- {
- "type": "Action.Submit",
- "title": "Submit"
- }
- ],
- "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
- "version": "1.2"
+ "type": "AdaptiveCard",
+ "body": [
+ {
+ "type": "TextBlock",
+ "size": "Medium",
+ "weight": "Bolder",
+ "text": "People Picker with Org search enabled"
+ },
+ {
+ "type": "Input.ChoiceSet",
+ "choices": [
+ {
+ "title": "Custom Profile 1",
+ "value": "Profile1"
+ },
+ {
+ "title": "Custom Profile 2",
+ "value": "Profile2"
+ }
+ ],
+ "choices.data": {
+ "type": "Data.Query",
+ "dataset": "graph.microsoft.com/users"
+ },
+ "id": "people-picker",
+ "isMultiSelect": true
+ }
+ ],
+ "actions": [
+ {
+ "type": "Action.Submit",
+ "title": "Submit"
+ }
+ ],
+ "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
+ "version": "1.2"
} ```
The following image illustrates People Picker in Adaptive Cards with static choi
![People Picker static choice](../../assets/images/cards/peoplepicker-static-choice.png) - You can implement People Picker for efficient task management in different scenarios. ## Code sample
-| Sample Name | Description | C# | Node.js |
+| Sample Name | Description | C# | Node.js |
|:|:--|:|:--|
-|People picker control in Adaptive Cards| This sample demonstrates how to use the people picker control in Adaptive Cards.|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-people-picker-adaptive-card/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-people-picker-adaptive-card/nodejs) |
-
+|People picker control in Adaptive Cards| This sample demonstrates how to use the people picker control in Adaptive Cards.|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-people-picker-adaptive-card/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/bot-people-picker-adaptive-card/nodejs) |
## See also [Cards Reference](cards-reference.md)-
platform Task Modules Tabs https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/task-modules-and-cards/task-modules/task-modules-tabs.md
The following table provides the possible values of `err` that can be received b
|Sample name | Description | .NET | Node.js| |-|--|--|-|
-|Task module sample tabs and bots-V3 | Samples for creating task modules. |[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-task-module/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-task-module/nodejs)|
+|Task module sample tabs and bots-V3 | Samples for creating task modules. |[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-task-module/csharp)|[View](https://github.com/OfficeDev/Microsoft-Teams-Samples/tree/main/samples/app-task-module/nodejs)|
## Next step
platform Teamsfx CLI https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-CLI.md
Microsoft Teams Framework (TeamsFx) is a library encapsulating common functional
Here's a list of main TeamsFx features: -- **TeamsFx Collaboration**: Let developers and project owner invite other collaborators to the TeamsFx project. You can collaborate to debug and deploy a TeamsFx project.
+* **TeamsFx Collaboration**: Let developers and project owner invite other collaborators to the TeamsFx project. You can collaborate to debug and deploy a TeamsFx project.
-- **TeamsFx CLI**: It accelerates Teams application development. It also enables CI/CD scenario where you can integrate CLI in scripts for automation.--- **TeamsFx SDK**: TeamsFx Software Development Kit (SDK) is the main TeamsFx code library encapsulating simple authentication for both client and server-side code tailored for Teams developers.
+* **TeamsFx CLI**: It accelerates Teams application development. It also enables CI/CD scenario where you can integrate CLI in scripts for automation.
+* **TeamsFx SDK**: TeamsFx Software Development Kit (SDK) is the main TeamsFx code library encapsulating simple authentication for both client and server-side code tailored for Teams developers.
## TeamsFx command line interface TeamsFx CLI is a text-based command line interface that accelerates Teams application development. It aims to provide keyboard centric experience while building Teams applications. It also enables CI/CD scenario where you can integrate CLI in scripts for automation. For more information, see:
-* [Source code](https://github.com/OfficeDev/TeamsFx/tree/dev/packages/cli)
+
+* [Source code](https://github.com/OfficeDev/TeamsFx/tree/dev/packages/cli)
* [Package (NPM)](https://www.npmjs.com/package/@microsoft/teamsfx-cli) ## Get Started
Preview the current application from local or remote.
Dependencies: -- Node.js-- .NET SDK-- Azure Functions Core Tools
+* Node.js
+* .NET SDK
+* Azure Functions Core Tools
```bash teamsfx preview --local
teamsfx config set telemetry off
#### Disable environment checker There are three configuration to turn on or off Node.js, .NET SDK and Azure Functions Core Tools validation, and all of them are enabled by default. You can set the configuration to "off" if you don't need the dependencies validation and want to install the dependencies by yourself. Check the following guides:+ * [Node.js installation guide](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/vscode-extension/envchecker-help.md#how-to-install-nodejs)
-* [.NET SDK installation guide](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/vscode-extension/envchecker-help.md#how-to-install-net-sdk)
+* [.NET SDK installation guide](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/vscode-extension/envchecker-help.md#how-to-install-net-sdk)
* [Azure Functions Core Tools installation guide](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/vscode-extension/envchecker-help.md#how-to-install-azure-functions-core-tools). To disable .NET SDK validation, you can use the following command:
teamsfx permission status --env dev --list-all-collaborators
As a project creator: -- To create a new TeamsFx tab or bot project, and select Azure as the host type:
+* To create a new TeamsFx tab or bot project, and select Azure as the host type:
```bash teamsfx new --interactive false --app-name newapp --host-type azure ``` -- To login to Microsoft 365 account and Azure account:
+* To login to Microsoft 365 account and Azure account:
```bash teamsfx account login azure teamsfx account login Microsoft 365 ``` -- To provision your project:
+* To provision your project:
```bash teamsfx provision ``` -- To view collaborators:
+* To view collaborators:
```bash teamsfx permission status --env dev --list-all-collaborators
As a project creator:
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/permission-status-all-1.png" alt-text="permission-1"::: -- To add another account as collaborator. Ensure the added account is under the same tenant:
+* To add another account as collaborator. Ensure the added account is under the same tenant:
```bash teamsfx permission grant --env dev --email user-email@user-tenant.com
As a project creator:
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/permission-grant-1.png" alt-text="permission"::: -- To push your project to GitHub
+* To push your project to GitHub
As a Project Collaborator: -- Clone the project from GitHub.-- Login to Microsoft 365 account. Ensure that the same Microsoft 365 account is added:
+* Clone the project from GitHub.
+* Login to Microsoft 365 account. Ensure that the same Microsoft 365 account is added:
```bash teamsfx account login Microsoft 365 ``` -- Login to Azure account with contributor permission for all Azure resources.
+* Login to Azure account with contributor permission for all Azure resources.
```bash teamsfx account login azure ``` -- Check permission status. You should find yourself have the owner permission of the project:
+* Check permission status. You should find yourself have the owner permission of the project:
```bash teamsfx permission status --env dev ```+ ![permission status](./images/permission-status.png) -- Update Tab code, and deploy the project to remote.-- Launch remote and the project should work fine.
+* Update Tab code, and deploy the project to remote.
+* Launch remote and the project should work fine.
## See also * [TeamsFx SDK for TypeScript or JavaScript](TeamsFx-SDK.md) * [Manage multiple environments in Teams Toolkit](TeamsFx-multi-env.md) * [Collaborate on Teams project using Teams Toolkit](TeamsFx-collaboration.md)
-
platform Teamsfx SDK https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-SDK.md
TeamsFx aims to reduce tasks of implementing identity and access to cloud resour
Use the library to: -- Access core functionalities in client and server environment in a similar way.-- Write user authentication code in a simplified way.
+* Access core functionalities in client and server environment in a similar way.
+* Write user authentication code in a simplified way.
## Get started
For more information, see [Teams app project](https://github.com/OfficeDev/Teams
### Prerequisites -- Node.js version `10.x.x` or later.-- If your project has installed `botbuilder` related [packages](https://github.com/Microsoft/botbuilder-js#packages) as dependencies, ensure they are of the same version and the version is `>= 4.9.3`. ([Issue - all of the BOTBUILDER packages should be the same version](https://github.com/BotBuilderCommunity/botbuilder-community-js/issues/57#issuecomment-508538548))
+* Node.js version `10.x.x` or later.
+* If your project has installed `botbuilder` related [packages](https://github.com/Microsoft/botbuilder-js#packages) as dependencies, ensure they are of the same version and the version is `>= 4.9.3`. ([Issue - all of the BOTBUILDER packages should be the same version](https://github.com/BotBuilderCommunity/botbuilder-community-js/issues/57#issuecomment-508538548))
For more information, see:
-* [Source code](https://github.com/OfficeDev/TeamsFx/tree/main/packages/sdk)
-* [Package (NPM)](https://www.npmjs.com/package/@microsoft/teamsfx)
-* [API reference documentation](https://aka.ms/teamsfx-sdk-help)
+
+* [Source code](https://github.com/OfficeDev/TeamsFx/tree/main/packages/sdk)
+* [Package (NPM)](https://www.npmjs.com/package/@microsoft/teamsfx)
+* [API reference documentation](https://aka.ms/teamsfx-sdk-help)
* [Samples](https://github.com/OfficeDev/TeamsFx-Samples) ### Install the `@microsoft/teamsfx` package
npm install @microsoft/teamsfx
To create graph client object for accessing Microsoft Graph API, you will need the credentials to authenticate. The SDK provides several credential classes to choose that meets various requirements. You need to load configuration before using any credentials. -- In browser environment, you need to explicitly pass in the configuration parameters. The scaffolded React project has provided environment variables to use.
+* In browser environment, you need to explicitly pass in the configuration parameters. The scaffolded React project has provided environment variables to use.
```ts loadConfiguration({
loadConfiguration({
}); ``` -- In NodeJS environment like Azure Function, you can just call `loadConfiguration`. It will load from environment variables by default.
+* In NodeJS environment like Azure Function, you can just call `loadConfiguration`. It will load from environment variables by default.
```ts loadConfiguration();
const credential = new TeamsUserCredential();
const graphClient = createMicrosoftGraphClient(credential, ["User.Read"]); // Initializes MS Graph SDK using our MsGraphAuthProvider const profile = await graphClient.api("/me").get(); ```+ > [!NOTE] > You can use this credential class in browser application, such as Teams Tab App.
setLogFunction((level: LogLevel, message: string) => {
## See also
-[Microsoft TeamsFx sample gallery](https://github.com/OfficeDev/TeamsFx-Samples)
+[Microsoft TeamsFx sample gallery](https://github.com/OfficeDev/TeamsFx-Samples)
platform Teamsfx Collaboration https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-collaboration.md
You can't remove collaborators directly from Teams Toolkit extension. Perform th
6. Select and remove the collaborator. > [!NOTE]
+>
> * Collaborator added to your project will not receive any notification. Project owner needs to notify collaborator offline. > * Azure related permissions must be set manually by Azure subscription administrator on Microsoft Azure portal. Azure account must have contributor role for the subscription so that developers can work together to provision, and deploy TeamsFx project.
platform Teamsfx Manifest Customization https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-manifest-customization.md
Last updated 11/29/2021
Teams Toolkit consists of the following manifest template files under `templates/appPackage` folder: -- `manifest.local.template.json` - local debug teams app-- `manifest.remote.template.json` - shared in all environments
+* `manifest.local.template.json` - local debug teams app
+* `manifest.remote.template.json` - shared in all environments
## Prerequisite
During local debug, Teams Toolkit loads manifest from `manifest.local.template.j
## Supported placeholder in manifest.remote.template.json -- `{{state.xx}}` is pre-defined placeholder whose value is resolved by Teams Toolkit, defined in `state.{env}.json`. Ensure not to modify the values in state.{env}.json.-- `{{config.manifest.xx}}` is customized placeholder whose value is resolved from `config.{env}.json`.
- - You can add a customized parameter as follows:
- - Add a placeholder in manifest.remote.template.json with pattern: `{{config.manifest.xx}}`
- - Add a config value in config.{env}.json
+* `{{state.xx}}` is pre-defined placeholder whose value is resolved by Teams Toolkit, defined in `state.{env}.json`. Ensure not to modify the values in state.{env}.json.
+* `{{config.manifest.xx}}` is customized placeholder whose value is resolved from `config.{env}.json`.
+ * You can add a customized parameter as follows:
+ * Add a placeholder in manifest.remote.template.json with pattern: `{{config.manifest.xx}}`
+ * Add a config value in config.{env}.json
```json {
platform Teamsfx Manifest Preview https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-manifest-preview.md
Last updated 11/29/2021
After scaffolding, the following are the manifest template files available under `templates/appPackage` folder: -- `manifest.local.template.json` - local debug teams app.-- `manifest.remote.template.json` - shared between all remote environments.
+* `manifest.local.template.json` - local debug teams app.
+* `manifest.remote.template.json` - shared between all remote environments.
The Template files consisting placeholders, and the actual values from Teams Toolkit are resolved in files under `.fx/configs` and `.fx/states`.
If there are more than one environment, you need to select the environment you w
After previewing the manifest file, you can sync your local changes to Dev portal by following the steps:
-1. Select **Update to Teams platform** at the top left corner of `manifest.{env}.json`
+1. Select **Update to Teams platform** at the top left corner of `manifest.{env}.json`
2. Select **Teams: Update manifest to Teams platform** at the menu bar of `manifest.{env}.json` You can also trigger **Teams: update manifest to Teams platform** from command palette
If the manifest file is outdated due to configuration file change or template ch
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/manifest preview -3.png" alt-text="pre"::: -- **Preview only**: local manifest file will be overwritten according to current configuration-- **Preview and update**: local manifest file will be overwritten according to current configuration and also updated to Teams platform-- **Cancel**: do nothing
+* **Preview only**: local manifest file will be overwritten according to current configuration
+* **Preview and update**: local manifest file will be overwritten according to current configuration and also updated to Teams platform
+* **Cancel**: do nothing
> [!NOTE] > The changes will be updated to dev portal. If you have some manual updates in dev portal, it will be overwritten.
platform Teamsfx Multi Env https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/TeamsFx-multi-env.md
Last updated 11/29/2021
After creating new project, Teams Toolkit by default creates: -- One `local` environment to represent the local machine environment configurations.-- One `dev` environment to represent the remote or cloud environment configurations.
+* One `local` environment to represent the local machine environment configurations.
+* One `dev` environment to represent the remote or cloud environment configurations.
> [!NOTE] > Each project can have only one `local` environment but multiple remote environments.
To add another remote environment, select the Teams icon in the sidebar, select
> [!NOTE] > If you have more than one existing environments, you need to select an existing environment to create the same. The command will copy file contents of `config.<newEnv>.json` and `azure.parameters.<newEnv>.json` from the existing environment you selected to the new environment being created.
-## Select target environment
+## Select target environment
You can select the target environment for all environment-related operations. The toolkit prompts and ask for a target environment when you have multiple remote environments as shown in the following image: :::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/manifest preview-1.png" alt-text="add env":::
-## Project folder structure
+## Project folder structure
After creating the project, you can view the project folders and files in the explorer area of Visual Studio Code. Besides the custom codes, some files are used by Teams Toolkit to maintain the config, state, and template of the app. The following list provides files and outlines their relationship with multiple environments. -- `.fx/configs`: configure files that user can customize for the Teams app.
- - `config.<envName>.json`: per-environment configuration file.
- - `azure.parameters.<envName>.json`: per-environment parameters file for Azure bicep provision.
- - `projectSettings.json`: global project settings , which apply to all environments.
- - `localSettings.json`: local debug configuration file.
-- `.fx/states`: provision result that is generated by the Toolkit.
- - `state.<envName>.json`: per-environment provision output file.
- - `<env>.userdata`: per-environment sensitive user data for the provision output.
-- `templates`
- - `appPackage`: app manifest template files.
- - `azure`: Bicep template files.
+* `.fx/configs`: configure files that user can customize for the Teams app.
+ * `config.<envName>.json`: per-environment configuration file.
+ * `azure.parameters.<envName>.json`: per-environment parameters file for Azure bicep provision.
+ * `projectSettings.json`: global project settings , which apply to all environments.
+ * `localSettings.json`: local debug configuration file.
+* `.fx/states`: provision result that is generated by the Toolkit.
+ * `state.<envName>.json`: per-environment provision output file.
+ * `<env>.userdata`: per-environment sensitive user data for the provision output.
+* `templates`
+ * `appPackage`: app manifest template files.
+ * `azure`: Bicep template files.
-## Customize the provision
+## Customize the provision
Teams Toolkit allows you to change the configuration files and template files to customize the resource provision in each environment.
You can set the Teams app name to `myapp(dev)` for the default environment `dev`
Perform the following steps for customization: -- 1. Open config file `.fx/configs/config.dev.json`.-- 2. Update the property of *manifest > appName > short* to `myapp(dev)`
+* 1. Open config file `.fx/configs/config.dev.json`.
+* 2. Update the property of *manifest > appName > short* to `myapp(dev)`
The updates to `.fx/configs/config.dev.json` are as follows:
Perform the following steps for customization:
} ``` -- 3. Create new environment and name it `staging` if it doesn't exist.-- 4. Open config file `.fx/configs/config.staging.json`.-- 5. Update the same property `myapp(staging)`.-- 6. Run provision command on `dev` and `staging` environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).
+* 3. Create new environment and name it `staging` if it doesn't exist.
+* 4. Open config file `.fx/configs/config.staging.json`.
+* 5. Update the same property `myapp(staging)`.
+* 6. Run provision command on `dev` and `staging` environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).
### Scenario 2: customize Teams App description for different environment In this scenario, you will learn how to set different Teams app description for different environments: -- For the default environment `dev`, the description will be `my app description for dev`;-- For the staging environment `staging`, the description will be `my app description for staging`;
+* For the default environment `dev`, the description will be `my app description for dev`;
+* For the staging environment `staging`, the description will be `my app description for staging`;
Perform the following steps for customization: -- 1. Open config file `.fx/configs/config.dev.json`.-- 2. Add new property of *manifest > description > short* with value `my app description for dev`.
+* 1. Open config file `.fx/configs/config.dev.json`.
+* 2. Add new property of *manifest > description > short* with value `my app description for dev`.
The updates to `.fx/configs/config.dev.json` are as follows:
Perform the following steps for customization:
} ``` -- 3. Create a new environment and name it `staging` if it doesn't exist.-- 4. Open config file `.fx/configs/config.staging.json`.-- 5. Add the same property to `my app description for staging`.-- 6. Open Teams app manifest template for remote `templates/appPackage/manifest.remote.template.json`.-- 7. Update the property `description > short` to use the **variable** defined in configure files with mustache syntax `{{config.manifest.description.short}}`.
+* 3. Create a new environment and name it `staging` if it doesn't exist.
+* 4. Open config file `.fx/configs/config.staging.json`.
+* 5. Add the same property to `my app description for staging`.
+* 6. Open Teams app manifest template for remote `templates/appPackage/manifest.remote.template.json`.
+* 7. Update the property `description > short` to use the **variable** defined in configure files with mustache syntax `{{config.manifest.description.short}}`.
The updates to `manifest.remote.template.json` are as follows:
Perform the following steps for customization:
... } ```-- 8. Run provision command against `dev` and `staging` environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).+
+* 8. Run provision command against `dev` and `staging` environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).
### Scenario 3: customize Teams App description for all environments
In this scenario, you will learn how to set the description of Teams app to `my
As the Teams app manifest template is shared across all environments, we can update the description value in it for our target: -- 1. Open Teams app manifest template for remote `templates/appPackage/manifest.remote.template.json`.-- 2. Update the property `description > short` with **hard-coded string** `my app description`.
+* 1. Open Teams app manifest template for remote `templates/appPackage/manifest.remote.template.json`.
+* 2. Update the property `description > short` with **hard-coded string** `my app description`.
The updates to `manifest.remote.template.json` are as follows:
As the Teams app manifest template is shared across all environments, we can upd
... } -- 3. Run provision command against **all** environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).
+* 3. Run provision command against **all** environment to update the app name in remote environments. To run provision command with Teams Toolkit, see [provision](provision.md#provision-using-teams-toolkit).
### Scenario 4: customize Azure resources for different environment
platform Accounts https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/accounts.md
If you donΓÇÖt have an existing Microsoft 365 account with a valid subscription,
If you want to host your app related resources or access resources within Azure, you must have an Azure subscription. You can [create a free account](https://azure.microsoft.com/free/) before you begin.
-## Join Microsoft 365 developer program
+## Join Microsoft 365 developer program
If you don't have a Microsoft 365 account, you must sign up for a [Microsoft 365 developer program](https://developer.microsoft.com/microsoft-365/dev-program) subscription. The subscription is free for 90 days and continues to renew as long as you are using it for development activity. If you have a Visual Studio Enterprise or Professional subscription, both programs include a free Microsoft 365 [developer subscription](https://aka.ms/MyVisualStudioBenefits). It is active as long as your Visual Studio subscription is active. For more information, see [set up a Microsoft 365 developer subscription](https://developer.microsoft.com/microsoft-365/dev-program).
If you don't have a Microsoft 365 account, you must sign up for a [Microsoft 365
You can sign up for the developer program by using one of the following account types: -- **Microsoft account for personal use**
+* **Microsoft account for personal use**
Provides access to all consumer oriented Microsoft products and cloud services, such as Outlook, Messenger, OneDrive, MSN, Xbox Live, or Microsoft 365. Signing up for an Outlook.com mailbox automatically creates a Microsoft account. After a Microsoft account is created, it can be used to access consumer-related Microsoft cloud services or Azure. -- **Work account for business**
+* **Work account for business**
Provides access to all small, medium, and enterprise business-level Microsoft cloud services, such as Azure, Microsoft Intune, or Microsoft 365. When you sign up to one of these services as an organization, a cloud-based directory is automatically provisioned in Microsoft Azure Active Directory (Azure AD) to represent your organization. -- **Visual Studio ID**
+* **Visual Studio ID**
You can create for your Visual Studio Professional or Enterprise subscriptions - We recommend that you use this option to join the developer program from within the Visual Studio Gallery to get the full benefits as a Visual Studio subscriber.
If you can't see **Upload a custom app** option, this indicates that you don't h
:::image type="content" source="../assets/images/teams-toolkit-v2/4.png" alt-text="toggle":::
-5. Select **Save**.
+5. Select **Save**.
> [!Note] > It can take up to 24 hours for the sideloading to be active. In the meantime, you can use **upload for your tenant** to test your app. To upload the .zip package file of the app, see [upload custom apps](/microsoftteams/teams-app-setup-policies).
platform Add Capability https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/add-capability.md
You can create a new Teams app with one of the Teams app capabilities. During ap
:::image type="content" source="../assets/images/teams-toolkit-v2/manual/add capabilities.png" alt-text="capabilities":::
- You can also open the command palette and enter **Teams: Add Capabilities**:
-
+ You can also open the command palette and enter **Teams: Add Capabilities**:
+ :::image type="content" source="../assets/images/teams-toolkit-v2/manual/tree view capabilities.png" alt-text="Alternate capabilities"::: 1. From the pop-up, select the capabilities to include in your project:
The selected capabilities are succesfully added to your project. The Teams Toolk
## Supported capabilities matrix
-Apart from the capabilities your Teams app already have, you can choose to add different capabilities to your Teams app. The following table provides the different Teams app capabilities:
+Apart from the capabilities your Teams app already have, you can choose to add different capabilities to your Teams app. The following table provides the different Teams app capabilities:
|Existing capabilities|Other supported capabilities can be added| |--|--|
Apart from the capabilities your Teams app already have, you can choose to add d
After adding bot and messaging extension, the changes in your project are as follows: -- A bot template code is added into a subfolder with path `yourProjectFolder/bot`. This includes a **hello world** bot application template into your project.-- `launch.json` and `task.json` under `.vscode` folder are updated, which includes necessary scripts for Visual Studio Code, and is executed when you want to debug your application locally. -- `manifest.remote.template.json` and `manifest.local.template.json` file under `templates/appPackage` folder are updated, which includes bot related information in the manifest file that represents your application in the Teams Platform. The changes are as follows:
- - The ID of your bot.
- - The scopes of your bot.
- - The commands that hello world bot application can respond to.
-- The files under `templates/azure/teamsfx` will be updated, and `templates/azure/provision/xxx`.bicep file will be regenerated.-- The files under `.fx/config` are regenerated, which ensures your project is set with right configurations for newly added capability.
+* A bot template code is added into a subfolder with path `yourProjectFolder/bot`. This includes a **hello world** bot application template into your project.
+* `launch.json` and `task.json` under `.vscode` folder are updated, which includes necessary scripts for Visual Studio Code, and is executed when you want to debug your application locally.
+* `manifest.remote.template.json` and `manifest.local.template.json` file under `templates/appPackage` folder are updated, which includes bot related information in the manifest file that represents your application in the Teams Platform. The changes are as follows:
+ * The ID of your bot.
+ * The scopes of your bot.
+ * The commands that hello world bot application can respond to.
+* The files under `templates/azure/teamsfx` will be updated, and `templates/azure/provision/xxx`.bicep file will be regenerated.
+* The files under `.fx/config` are regenerated, which ensures your project is set with right configurations for newly added capability.
After adding tab, the changes in your project are as follows: -- A frontend tab template code is added into a subfolder with path `yourProjectFolder/tab`, which includes a **hello world** tab application template into your project.-- `launch.json` and `task.json` under `.vscode` folder are updated, which includes necessary scripts for Visual Studio Code, and is executed when you want to debug your application locally. -- `manifest.remote.template.json` and `manifest.local.template.json` file under `templates/appPackage` folder are updated, which includes tab-related information in the manifest file that represents your application in the Teams Platform, the changes are as follows:
- - The configurable and static tabs.
- - The scopes of the tabs.
-- The files under `templates/azure/teamsfx` will be updated, and `templates/azure/provision/xxx`.bicep file will be regenerated.-- The file under `.fx/config` are regenerated, which ensures your project is set with right configurations for newly added capability.
+* A frontend tab template code is added into a subfolder with path `yourProjectFolder/tab`, which includes a **hello world** tab application template into your project.
+* `launch.json` and `task.json` under `.vscode` folder are updated, which includes necessary scripts for Visual Studio Code, and is executed when you want to debug your application locally.
+* `manifest.remote.template.json` and `manifest.local.template.json` file under `templates/appPackage` folder are updated, which includes tab-related information in the manifest file that represents your application in the Teams Platform, the changes are as follows:
+ * The configurable and static tabs.
+ * The scopes of the tabs.
+* The files under `templates/azure/teamsfx` will be updated, and `templates/azure/provision/xxx`.bicep file will be regenerated.
+* The file under `.fx/config` are regenerated, which ensures your project is set with right configurations for newly added capability.
## Limitations
platform Create New Project https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/create-new-project.md
To create new Teams project using Teams Toolkit, select **Create a new Teams app
The following guides helps you to create a new Teams app project using Teams Toolkit: -- [Create new Teams Tab app (React)](/microsoftteams/platform/sbs-gs-javascript?tabs=vscode%2Cvsc%2Cviscode%2Cvcode&tutorial-step=2)-- [Create new Teams Bot app](/microsoftteams/platform/sbs-gs-spfx?tabs=vscode%2Cviscode&branch)-- [Create new Message Extension app](/microsoftteams/platform/sbs-gs-javascript?tabs=vscode%2Cvsc%2Cviscode%2Cvcode&tutorial-step=6&branch)-- [Create new Teams Tab app (SharePoint Framework)](/microsoftteams/platform/sbs-gs-spfx?tabs=vscode%2Cviscode&branch)
+* [Create new Teams Tab app (React)](/microsoftteams/platform/sbs-gs-javascript?tabs=vscode%2Cvsc%2Cviscode%2Cvcode&tutorial-step=2)
+* [Create new Teams Bot app](/microsoftteams/platform/sbs-gs-spfx?tabs=vscode%2Cviscode&branch)
+* [Create new Message Extension app](/microsoftteams/platform/sbs-gs-javascript?tabs=vscode%2Cvsc%2Cviscode%2Cvcode&tutorial-step=6&branch)
+* [Create new Teams Tab app (SharePoint Framework)](/microsoftteams/platform/sbs-gs-spfx?tabs=vscode%2Cviscode&branch)
## Create from samples
The following guides helps you to create a new Teams app project using Teams Too
1. Open **Teams Toolkit** from Microsoft Visual Studio Code. 1. Select **DEVELOPMENT** section in Tree View. 1. Select **View samples**. The sample gallery appears as shown in the following image:
-
+ :::image type="content" source="../assets/images/teams-toolkit-v2/manual/view samples.png" alt-text="samples"::: You can explore and download samples and either run apps locally or remotely to preview in Teams web client. Follow the instructions of each sample or browse the source code of samples by selecting **View on GitHub** to access open source repo for samples.
platform Deploy https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/deploy.md
Teams Toolkit helps you to deploy or upload the frontend and backend code in you
* [Install Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) version v3.0.0+. > [!NOTE]
+>
> * Ensure you have Teams app project opened in VS code. > * Before you deploy project code to cloud, [provision the cloud resources](provision.md). ## Deploy Teams apps using Teams Toolkit The get started guides help you to deploy using Teams Toolkit. You can use the following to deploy your Teams app:+ * [Deploy your app to Azure](/microsoftteams/platform/sbs-gs-javascript?tabs=vscode%2Cvsc%2Cviscode%2Cvcode&tutorial-step=8&branch) * [Deploy your app to SharePoint](/microsoftteams/platform/sbs-gs-spfx?tabs=vscode%2Cviscode&tutorial-step=4&branch)
platform Provision https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/provision.md
TeamsFx integrates with Azure and Microsoft 365 cloud, which allows you to place
* Account prerequisites To provision cloud resources, you must have the following accounts:
- * Microsoft 365 account with valid subscription
- * Azure with valid subscription
+ * Microsoft 365 account with valid subscription
+ * Azure with valid subscription
For more information, see [how to prepare accounts for building Teams app](accounts.md). * [Install Teams Toolkit](https://marketplace.visualstudio.com/items?itemName=TeamsDevApp.ms-teams-vscode-extension) version v3.0.0+.
When you create a new project, you can use all the Azure resources. The ARM temp
## Customize resource provision
-Teams Toolkit enables you to use an infrastructure as code approach to define what Azure resources you want to provision, and how you want to configure. The tool uses ARM template to define Azure resources. The ARM template is a set of bicep files that defines the infrastructure and configuration for your project. You can customize Azure resources by modifying the ARM template. For more information, see [bicep document](/azure/azure-resource-manager/bicep.md).
+Teams Toolkit enables you to use an infrastructure as code approach to define what Azure resources you want to provision, and how you want to configure. The tool uses ARM template to define Azure resources. The ARM template is a set of bicep files that defines the infrastructure and configuration for your project. You can customize Azure resources by modifying the ARM template. For more information, see [bicep document](/azure/azure-resource-manager/bicep.md).
Provision with ARM involves changing the following sets of files, parameters and templates:
The following steps are:
} ```
-### Scenerio
+### Scenerio
-**To add other Azure resource or storage to the application**
+To add other Azure resource or storage to the application:
Consider the scenario, you want to add Azure storage to your Azure function backend to store blob data. There is no auto flow to update the bicep template with Azure storage support. However, you can edit the bicep file and add the resource. The steps are as follows:
You can follow [provision SharePoint-based app](/microsoftteams/platform/sbs-gs-
> [!NOTE] > Currently, the building Teams app with sharepoint framework with Teams Toolkit doesn't have direct integration with Azure, the contents in the doc doesn't apply to SPFx based apps. - <br> </details>
platform Publish https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/publish.md
Perform the following steps to upload app package:
:::image type="content" source="../assets/images/teams-toolkit-v2/teams toolkit fundamentals/uplo.png" alt-text="upload":::
-## Publish to your organization
+## Publish to your organization
When the app is ready for use in production, you can submit the app using the Teams app submission API, called from Graph API, an integrated development environment (IDE) such as Microsoft Visual Studio Code installed with Teams toolkit. You can either select **Publish to Teams** from **DEPLOYMENT** in TreeView of Teams Toolkit, or trigger **Teams: Publish to Teams** from command palette. Then select **Install for your organization**:
For more information, see [publish to microsoft Teams store]([Publish your app t
## See also * [Manage multiple environments](TeamsFx-multi-env.md)
-* [Collaborate with other developers on Teams project](TeamsFx-collaboration.md)
+* [Collaborate with other developers on Teams project](TeamsFx-collaboration.md)
platform Use CICD Template https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/use-CICD-template.md
You can follow the listed pre-defined example bash scripts to build and customiz
The scripts are based on a cross-platform TeamsFx command line tool [TeamsFx-CLI](https://www.npmjs.com/package/@microsoft/teamsfx-cli). You can install it with `npm install -g @microsoft/teamsfx-cli` and follow the [documentation](https://github.com/OfficeDev/TeamsFx/blob/dev/docs/cli/user-manual.md) to customize the scripts. > [!NOTE]
+>
> * To enable `@microsoft/teamsfx-cli` running in CI mode, turn on `CI_ENABLED` by `export CI_ENABLED=true`. In CI mode, `@microsoft/teamsfx-cli` is friendly for CI or CD. > * To enable `@microsoft/teamsfx-cli` running in the non-interactive mode, set a global config with command: `teamsfx config set -g interactive false`. In the non-interactive mode, `@microsoft/teamsfx-cli` does not prompt for inputs.
platform Visual Studio Code Tab Sso https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/toolkit/visual-studio-code-tab-sso.md
The Microsoft Teams Toolkit enables you to create single sign-on (SSO) authentic
1. Enter the URL where your app will be hosted and select **next**. Your app registration will be configured using the provided URL. 1. The app registration's configuration details will be stored in the `.env` files in your project's source code.
-If you would like to learn more about how your Azure app registration will be provisioned, please _see_ our [single sign-on (SSO) support for tabs](../tabs/how-to/authentication/auth-aad-sso.md) documentation.
+If you would like to learn more about how your Azure app registration will be provisioned, please *see* our [single sign-on (SSO) support for tabs](../tabs/how-to/authentication/auth-aad-sso.md) documentation.
> [!TIP] > You will need to go to **Azure App Registrations** and update your *API URI* and *redirect URLs* whenever you change this URL.
If you would like to learn more about how your Azure app registration will be pr
1. Select **npm install** from the `api-server` folder. Then **npm start**. 1. Select **npm install** from the `.src` folder. Then **npm start**.
-1. If you are using a tunneling service like [ngrok](https://ngrok.com/), run it and make sure the URL matches with what you entered in the project creation wizard. If it doesn't, you will need to update your _API URI_ and _redirect URL_ in the app registration that was created in Azure.
+1. If you are using a tunneling service like [ngrok](https://ngrok.com/), run it and make sure the URL matches with what you entered in the project creation wizard. If it doesn't, you will need to update your *API URI* and *redirect URL* in the app registration that was created in Azure.
1. Navigate to the activity bar on the left side of the Visual Studio Code window. 1. Select the **Run** icon to display the **Run and Debug** view. 1. You can also use the keyboard shortcut **Ctrl+Shift+D**.
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) and
| Date | Update | Find here | | | | |
+|03/10/2022| Added information on Moodle LMS and Microsoft 365 plugins | Integrate with Teams > Moodle LMS > [Moodle learning management system](resources/moodle-overview.md)|
|03/03/2022 | How to add authentication using external OAuth provider| Add authentication > Tabs > [Use external OAuth providers](tabs/how-to/authentication/auth-oauth-provider.md) | |02/25/2022| Introduced step-by-step guide to invoke task modules in Teams| Build cards and task modules > Build task modules > Use task modules from bots > [Invoke task module from Teams](sbs-botbuilder-taskmodule.yml)| |02/24/2022| Introduced step-by-step guide to build action based messaging extension | Build Messaging Extensions > Action commands > Define action commands > [Build action based messaging extension](sbs-meetingextension-action.yml)|
Microsoft Teams platform features that are available to all app developers.
| **Date** | **Update** | **Find here** | | -- | | -|
+|03/10/2022 | Added information on Moodle LMS and Microsoft 365 plugins | Integrate with Teams > Moodle LMS > [Moodle learning management system](resources/moodle-overview.md)|
|03/03/2022 | How to add authentication using external OAuth provider| Add authentication > Tabs > [Use external OAuth providers](tabs/how-to/authentication/auth-oauth-provider.md) | | 02/25/2022| Introduced step-by-step guide to invoke task modules in Teams| Build cards and task modules > Build task modules > Use task modules from bots > [Invoke task module from Teams](sbs-botbuilder-taskmodule.yml)| | 02/24/2022| Introduced step-by-step guide to build action based messaging extension | Build Messaging Extensions > Action commands > Define action commands > [Build action based messaging extension](sbs-meetingextension-action.yml)|