Updates from: 08/03/2022 01:36:30
Service Microsoft Docs article Related commit history on GitHub Change details
platform Include Saas Offer https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/prepare/include-saas-offer.md
When planning how to monetize your Teams app, here are some things to consider:
* Learn how [Azure Active Directory single sign-on (SSO)](/azure/marketplace/azure-ad-saas) helps your customers purchase and manage subscriptions. (Microsoft Azure Active Directory (Azure AD) SSO is required for Teams apps with SaaS offers.) * Understand that you're responsible for managing and paying for the infrastructure required to support your customers' use of your SaaS offer. * Plan for mobile. To avoid violating third-party app store policies, your app can't include links that allow users to purchase subscription plans on mobile. However, you can still indicate if your app has features that require a subscription plan. For more information, see the related [commercial marketplace certification policies](/legal/marketplace/certification-policies#114048-mobile-experience).
-* Teams currently doesn't support flat rate pricing models. However, you can create a flat rate transactable offer in Partner Center. For more information, see [best practices for selling a flat rate transactable offer](#best-practices-for-selling-a-flat-rate-transactable-offer).
## Integrate with the SaaS Fulfillment APIs
For complete instructions, see [build the landing page for your SaaS offer](/azu
Consider the following approaches when building a landing page for the Teams app youΓÇÖre monetizing. See an example landing page in the [end-user purchasing experience](#end-user-purchasing-experience).
-* Users must be able to log in to your landing page with the same Azure AD credentials they used to buy the subscription. For more information, see [Azure AD and transactable SaaS offers in the commercial marketplace](/azure/marketplace/azure-ad-saas).
-* Allow users to take the following actions on your landing page. DonΓÇÖt forget to consider whatΓÇÖs appropriate for a userΓÇÖs role and permissions (for example, you may want to allow only subscription admins to search for users):
+* Users must be able to sign in to your landing page with the same Azure AD credentials they used to buy the subscription. For more information, see [Azure AD and transactable SaaS offers in the commercial marketplace](/azure/marketplace/azure-ad-saas).
+* Allow users to take the following actions on your landing page. DonΓÇÖt forget to consider whatΓÇÖs appropriate for a userΓÇÖs role and permissions. For example, you may want to allow only subscription admins to search for users):
* Search for users in their org using email or another form of identity. * See users they can assign licenses to in a list. * Assign licenses to one or multiple users at the same time.
Consider the following approaches when building a landing page for the Teams app
Once youΓÇÖve integrated the SaaS Fulfillment APIs and built your landing page where users can manage their subscriptions, it's time to officially create, test, and publish your transactable SaaS offer.
-> [!IMPORTANT]
-> Teams currently supports only **Per user** (user/month and user/year) pricing model for SaaS offers. For more information, see [SaaS pricing models](/azure/marketplace/plan-saas-offer#saas-pricing-models).
- ### Create the offer 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.
See [create a SaaS offer](/azure/marketplace/create-new-saas-offer) for complete
### Test the offer
-We strongly recommend that you verify the end-to-end purchasing experience before publishing your SaaS offer. You can do this by creating a separate offer just for testing. For complete information, see [test offer overview](/azure/marketplace/plan-saas-offer#test-offer), [create a test offer](/azure/marketplace/create-saas-dev-test-offer), and [preview your offer](/azure/marketplace/test-publish-saas-offer).
+We recommend that you verify the end-to-end purchasing experience before publishing your SaaS offer. You can verify by creating a separate offer just for testing. For complete information, see [test offer overview](/azure/marketplace/plan-saas-offer#test-offer), [create a test offer](/azure/marketplace/create-saas-dev-test-offer), and [preview your offer](/azure/marketplace/test-publish-saas-offer).
> [!IMPORTANT] > You can test an end-to-end transaction in Teams using the [Test preview for monetized apps](Test-preview-for-monetized-apps.md) feature. For live offers you must complete the app store validation process.
YouΓÇÖve published your SaaS offer, but you still must link it to your Teams app
YouΓÇÖve created your SaaS offer and linked it to your Teams appΓÇönow it's time to publish your app to the Teams store. For complete instructions, see [publish your app to the Teams store](~/concepts/deploy-and-publish/appsource/publish.md). > [!IMPORTANT]
-> Even if your app is already listed on the Teams store, you still must go through the store validation process again to include your SaaS offer.
+>
+> * Even if your app is already listed on the Teams store, you still must go through the store validation process again to include your SaaS offer.
+> * Flat rate offers created without the Offer ID and Publisher ID in the app manifest should be updated and resubmitted for validation.
Once published, users will see a **Buy a subscription** option in the app details dialog when they try to add your app to Teams.
If you unlink a SaaS offer included in your Teams store listing, you must republ
1. Select **Distribute > Publish to the Teams store**. 1. Select **Open Partner Center** to begin the process of republishing your app without the offer.
-## Best practices for selling a flat rate transactable offer
-
-1. Create your [flat rate transactable SaaS offer](/azure/marketplace/plan-saas-offer) and [publish to AppSource](/azure/marketplace/test-publish-saas-offer).
-
-1. Link your [SaaS offer to the Teams app](/azure/marketplace/create-new-saas-offer) in Partner Center.
-
- > [!CAUTION]
- > Don't add the Offer ID and Publisher ID to the app manifest. The app won't pass the Teams store submission process.
-
-1. Build an in-app message in your Teams app that a subscription is needed and provide a hyperlink to your SaaS offer in AppSource to promote your flat rate offer.
-
- > [!NOTE]
- > Ensure any marketplace links don't appear on mobile and tablet devices to adhere to [third-party app store policies](/legal/marketplace/certification-policies).
-
-1. Submit your app for validation.
-
-1. After Teams marketplace supports flat rate pricing, update your app manifest with the Offer ID and Publisher ID and resubmit your app for validation.
- ## See also * [Maintaining and supporting your published app](../post-publish/overview.md)
platform Publish https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/concepts/deploy-and-publish/appsource/publish.md
If your app is production ready, you can begin the process of getting it listed
1. You've correctly mentioned the `subscriptionOffer` details in your app manifest in the format `publisherId.offerId`.
- 1. You must ensure your linked SaaS offer is designed to support licenses assigned on a named [per user model](/azure/marketplace/create-new-saas-offer-plans). Linked SaaS offers that support other pricing models such as flat rate are currently not accepted for publishing to the Teams store.
+ 1. You must ensure your linked SaaS offer is designed to support licenses assigned on a [SaaS pricing model](/azure/marketplace/create-new-saas-offer-plans).
1. Include test instructions or setup instructions or link to a demo video detailing app functionality and supported scenarios and any additional information to enable our testers to easily understand your SaaS portal workflows.
platform App With Collaboration Controls https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/app-with-collaboration-controls.md
+
+ Title: Application with Collaboration controls
+
+description: In this module, learn how to build a model-driven app with Collaboration controls for Teams and how to add Collaboration controls to the app.
+ms.localizationpriority: medium
++++
+# Create a new model-driven app with Collaboration controls for Teams
+
+Collaboration controls are designed for [model-driven applications](/power-apps/maker/model-driven-apps/model-driven-app-overview). The following section covers how to create a model-driven app.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+## Create a model-driven application
+
+1. Open [https://make.powerapps.com.](https://make.powerapps.com/) or [https://make.preview.powerapps.com.](https://make.preview.powerapps.com/)
+
+1. Select **Solutions** in the left pane.
+
+1. Select **New solution**, so that you can provide a home for all your future customizations.
+
+ :::image type="content" source="../assets/images/collaboration-control/new-solution.png" alt-text="The screenshot is an example that shows the new solution.":::
+
+1. Provide the name and publisher of your new solution, this solution is going to hold your custom Collaboration Manager.
+
+ :::image type="content" source="../assets/images/collaboration-control/collaboration-manager.png" alt-text="The screenshot is an example that shows the Collaboration manager.":::
+
+1. Select **Create**
+
+1. After the solution is created, it appears in your list of solutions. Select your solution to open it.
+
+1. Before creating your app, create a home for your data. select **New** > **Table** to get started.
+
+ :::image type="content" source="../assets/images/collaboration-control/create-table.png" alt-text="The screenshot describes how to create a new table.":::
+
+1. Give your table a name. Under **Advanced options**, select **Creating a new activity**.
+
+ :::image type="content" source="../assets/images/collaboration-control/new-activity.png" alt-text="The screenshot describes how to create new activity.":::
+
+1. Select **Save**.
+
+1. After you're done creating your table, you can customize it by adding extra
+columns, relationships, and more (Optional).
+
+1. Now you can create a new model-driven app by selecting **New** > **App** > **Model-driven app.**
+
+ :::image type="content" source="../assets/images/collaboration-control/model-driven-app.png" alt-text="The screenshot is an example that shows the new model driven app.":::
+
+1. Choose new **Modern app designer (preview)** to open the new app.
+
+ :::image type="content" source="../assets/images/collaboration-control/model-driven-app-blank.png" alt-text="The screenshot is an example that shows the new model driven app blank.":::
+
+1. Select **Create.**
+
+1. Give your app a name and select **Create.**
+
+ :::image type="content" source="../assets/images/collaboration-control/collaboration-manager-for-inspection.png" alt-text="The screenshot is an example that shows the Collaboration manager for inspection.":::
+
+1. Select **Add page.**
+
+1. Select **Table based view and form.**
+
+ :::image type="content" source="../assets/images/collaboration-control/table-based.png" alt-text="The screenshot is an example that shows the table based view and form.":::
+
+1. Select **Next.**
+
+1. Search and select the table you've created earlier.
+
+ :::image type="content" source="../assets/images/collaboration-control/table-view-form-pages.png" alt-text="The screenshot is an example that shows the table view form pages.":::
+
+1. Select **Add.**
+
+1. Select **Publish** to save and publish your app.
+
+1. Select **Play** to test out your new app.
+
+Now youΓÇÖve successfully built a model-driven app.
+
+## Add Collaboration controls to your application
+
+Following are the steps to add Collaboration control capabilities such as Tasks, Meetings, Files, and Notes experiences to the app created:
+
+1. To include the Tasks, Meetings, and Notes tabs you need to edit the Main Information form. To begin, go back to the explorer and select your solution.
+
+1. Select the table you created in [Create a new model-driven app for Teams.](#create-a-new-model-driven-app-with-collaboration-controls-for-teams)
+
+1. Go to the Forms tab for your table.
+
+ :::image type="content" source="../assets/images/collaboration-control/forms-tab.png" alt-text="The screenshot is an example that shows the forms tab for your table.":::
+
+1. Select the Information form of form type **Main** to open it in the form designer.
+
+1. Once you are in the form designer, press and drag in a **1-column tab** from the **Components** section.
+
+ :::image type="content" source="../assets/images/collaboration-control/components.png" alt-text="The screenshot is an example that shows the components of power apps.":::
+
+1. After selecting the tab, rename the tab to ΓÇ£TasksΓÇ¥ in the property pane.
+
+1. Select the tab name to select the full section and select **Expand first component to full tab** in the Properties pane. This is required as the Collaboration controls are best viewed in full tab views.
+
+ :::image type="content" source="../assets/images/collaboration-control/tasks-pane.png" alt-text=" The screenshot describes how to select first component to full tab.":::
+
+ :::image type="content" source="../assets/images/collaboration-control/expand-first-component.png" alt-text=" The screenshot describes how to expand first component to full tab.":::
+
+1. Expand the Collaboration (Preview) category on the controls drawer and drag the Tasks (Preview) control onto the section in Tasks form.
+
+ :::image type="content" source="../assets/images/collaboration-control/collab-preview.png" alt-text="Preview control onto the section in tasks form":::
+
+3. Set the table to Activities & select Done.
+
+ :::image type="content" source="../assets/images/collaboration-control/select-table-activities.png" alt-text="Select the table to activities":::
+
+5. Select ΓÇÿHide LabelΓÇÖ on the Properties.
+
+ :::image type="content" source="../assets/images/collaboration-control/hide-label-properties.png" alt-text="Select hide label":::
+
+1. The Tasks control will now display.
+
+ :::image type="content" source="../assets/images/collaboration-control/new-collab-control.png" alt-text="Tasks control display":::
+
+1. Repeat the Tasks steps to add Approvals, Files, Meetings and Notes controls to your app.
+1. Once all controls are added, you'll see the controls rendered below in Form Designer. If a control doesn't render in Form Designer, for example shows a blank form, run your app in Power Apps and the presence of a 'configure' page or an 'empty state' means the control was successfully added.
+
+ :::image type="content" source="../assets/images/collaboration-control/new-collab-approval.png" alt-text="Controls form designer":::
+
+1. You can now run your power app in Power Apps by selecting it.
+
+ :::image type="content" source="../assets/images/collaboration-control/collaboration-manager-for-inspections-power-apps.png" alt-text="Collaboration manager for inspections":::
+
+1. Create a new record by selecting **+ New** and then open the record.
+
+ :::image type="content" source="../assets/images/collaboration-control/power-apps-open-the-record.png" alt-text="The screenshot is an example that shows the power apps that open the record.":::
+
+1. Now you can see views for each tab that appear similar to the following image:
+
+ :::image type="content" source="../assets/images/collaboration-control/tabs.png" alt-text="The screenshot is an example that shows the tasks.":::
+
+ > [!TIP]
+ > The controls are only visible after a record is saved in the application. If the control tabs don't appear in your record, try to refresh your browser or republish the app from Power Apps.
+
+Now youΓÇÖve successfully added the Collaboration controls to your application. You can now run your application in Power Apps and launch the controls. As settings haven't yet been configured, you'll not be able to create entities such as Tasks, or Meetings until those are added.
+
+## Define Settings for your Collaboration
+
+You can define settings for Collaboration controls for the business entity such as the table created in [new model-driven app](#create-a-new-model-driven-app-with-collaboration-controls-for-teams).
+
+The settings that you can apply are as follows:
+
+|Settings|Used by|
+|||
+|Group ID|Tasks, Internal Meetings, Approvals.|
+|Bookings business ID|External meetings using Bookings |
+|Site ID|SharePoint files |
+|Drive ID|SharePoint files|
+
+> [!NOTE]
+> Settings are crtical to launch your app, so ensure that you follow the steps as suggested. If you have issues launching and saving the controls recheck the values.
+
+You can get the Group ID by creating a new team or use an existing team in Microsoft Teams to host your application and create settings variables.
+
+To create a new team, see [create a team from scratch](https://support.microsoft.com/en-us/office/create-a-team-from-scratch-174adf5f-846b-4780-b765-de1a0a737e2b).
+
+Use the following instructions to retrieve the Group ID of your Teams team for Approvals, Tasks, and internal Meetings:
+
+1. Find your team in your teams list.
+
+1. Select the ellipse **...** and select **Get link to team**.
+
+ :::image type="content" source="../assets/images/collaboration-control/get-link.png" alt-text="The screenshot describes how to get the linked to the team.":::
+
+1. Copy the link and record the value of `groupId` from the URL. You'll use this value at a later stage while defining the settings of your solution.
+
+ `https://teams.microsoft.com/l/team/19%3akk_TuKhjXu92yJvg4TZ10S6rouLSCgvHIb5NOOTfRjg1%40thread.tacv2/conversations?groupId=4310f270-1aa5-4089-99f3-47eb3b4d69ad&tenantId=b699419b-e0df-47e3-9909-24076fdcf68b`
+
+Use the following instructions to retrieve the Retrieve the SharePoint Site ID and Drive ID for Files:
+
+1. To use the Files control, you'll need to configure to an existing SharePoint site or create a new SharePoint site. To create a new site, see [create a site](/sharepoint/create-site-collection).
+
+1. Now retrieve the Setting Values of Site ID and Drive ID, which can be called using the details in your SharePoint site.
+
+ 1. **Site ID**: Using [Graph Explorer](https://developer.microsoft.com/graph/graph-explorer), sign in and give permissions to Directory.ReadWrite.All and User.ReadWrite.All
+
+ :::image type="content" source="../assets/images/collaboration-control/graph-permissions.png" alt-text="The screenshot is an example that shows the Graph Explorer.":::
+
+ 1. Ensure that you replace hostname with your hostname and relative path to the site path and make a graph call to `https://graph.microsoft.com/v1.0/sites/{hostname}:/{relative-path-to-site}`. Following is an example:
+ 1. If your Site URL = <https://myhostname.sharepoint.com/sites/MySiteName>
+ 1. Hostname = myhostname.sharepoint.com
+ 1. Relative path to site = sites/MySiteName
+
+ :::image type="content" source="../assets/images/collaboration-control/graph-call.png" alt-text="The screenshot is an example that shows the Graph call.":::
+
+ Graph call would be, `https://graph.microsoft.com/v1.0/sites/myhostname.sharepoint.com:/sites/MySiteName`.
+
+ 1. The response received is a Json object representing the Site, for example Site ID would be `abcdef.sharepoint.com,0abe7394-6fce-4dcc-9884-7eaceb48cd41,8cb86762-16cd-495e-87cb-893cfdf94054`.
+
+ 1. Save the Site ID value parameter.
+
+ 1. **Drive ID**: Using [Graph Explorer](https://developer.microsoft.com/graph/graph-explorer), sign in and make the graph call to `https://graph.microsoft.com/v1.0/sites/{site-id}/drives` with the value of Site ID that you saved earlier.
+
+ 1. A Json response is returned with a parameter value of type array or list of drive objects. Look through the Json for the Json object whose name parameter matches the name of your document library. Save the value of the Drive ID parameter.
+
+To create meetings with users outside of your organization such as customers and to use virtual visit features within your app you would need to provide a Bookings business. For more information, see [Microsoft Bookings](/microsoft-365/bookings/bookings-overview?view=o365-worldwide&preserve-view=true).
+
+## Add Settings to your Collaboration Manager app
+
+To apply settings and explore the collaborative features of your app in Power Apps, open the application that you've created earlier. You would see a view page, where you can select the existing records or create new one. To begin with open or create a record.
+
+You would need to add the Settings IDs that you've saved earlier for your application
+
+|Settings|Used by|
+|||
+|Group ID|Tasks, internal Meetings, Approvals.|
+|Bookings business ID|External meetings using Bookings |
+|Site ID|SharePoint files |
+|Drive ID|SharePoint files|
+
+### Add Settings for Tasks, Meetings, and Files
+
+1. Launch a control and you can see a window as following:
+
+ :::image type="content" source="../assets/images/collaboration-control/launch-window.png" alt-text="The screenshot is an example that shows the control window.":::
+
+1. Select **Configure** and navigate to the General tab to add the Group ID.
+
+ :::image type="content" source="../assets/images/collaboration-control/groupid-general.png" alt-text="The screenshot describes how to add the Group ID in General tab.":::
+
+1. Open Files tab to add Site ID and Drive ID.
+
+ :::image type="content" source="../assets/images/collaboration-control/files-tab.png" alt-text="The screenshot describes how to add the site ID and drive ID in files tab.":::
+
+The Notes control doesn't require a setting value. Now you can create entities such as Tasks and Meetings in your application. If you're facing issues launching and saving the controls recheck the settings values.
+
+## Explore your new Collaboration Manager app
+
+Following sections guides you on how to use the Task, Notes, Meetings, Files, and Approvals controls.
+
+### Create Tasks
+
+Explore collaboration in the Tasks tab by selecting the Tasks tab, which opens an empty page where users can add all the relevant tasks they need to complete.
+
+1. To create a new task for the team, select **Add a task**. It opens a dialog where you can provide specifics about the task and assign it to the relevant people on the team and select Save.
+
+ :::image type="content" source="../assets/images/collaboration-control/add-task.png" alt-text="The screenshot describes on how to add a task.":::
+
+1. The saved task will appear in the tasks list.
+
+1. As all the tasks are backed by Microsoft Planner. Users can use the Tasks app within Microsoft Teams to see all the tasks that are assigned. To get started, select ellipses **…** in Teams left pane. Search and select Tasks by Planner and To Do.
+
+ :::image type="content" source="../assets/images/collaboration-control/tasks-planner.png" alt-text="The screenshot is an example of the Tasks by Planner and To Do.":::
+
+1. After opening the Tasks by Planner and To Do app, users can see all the tasks that were created in your app within the **Assigned to me** section of the app. Users can also view the details of a task, add attachments, and mark them as complete.
+
+### Create notes
+
+To create a note select **Notes** tab from your app, which would redirect to an empty screen where users can provide any relevant information. To add a new note, select **New note**.
+After adding relevant details in the notes, select **Save**.
+
+### Create meetings
+
+Select **Meetings** tab in a record to schedule both internal and external meetings.
+
+To schedule an internal meeting, select the dropdown next to the **New meeting** button and then select **Internal meeting**.
++
+> [!NOTE]
+>
+> Customer Booking is enabled, if you have configured the Microsoft Booking with a valid setting for your app.
+
+Within the **New meeting** dialog, users can provide relevant information about the meeting and select **Save**. The meeting appears in the meetings list.
++
+To schedule an external meeting with the customer, select the dropdown next to the **New meeting** button and select **Customer Booking**. If the **Customer Booking** option isn't available in the **New Meeting** dropdown, confirm if the app is configured to Microsoft Bookings in the Settings and the user has the Bookings Administrator role. For more information, see [add staff to Bookings](/microsoft-365/bookings/add-staff?view=o365-worldwide&preserve-view=true). You can add additional booking types by adding additional services within your Bookings business.
++
+Users can see both Internal meetings and Customer Bookings on their meeting list. After the meeting is started, users can join by selecting the **Join** button, which opens the meeting directly in Microsoft Teams.
+
+As the meetings are backed by Outlook, users can navigate to either Bookings, or Outlook Calendar to see all the meetings listed in a single calendar. Internal meetings are listed in shared calendar.
+
+Following are the steps to add a shared calendar to your Outlook (optional) :
+
+1. On the Home tab of the ribbon, in the Manage Calendars section, select Open Calendar > Open Shared Calendar.
+
+1. In the Open a Shared Calendar dialog , enter the person's name. Select the person you're looking for and then select OK.
+
+In the left Pane, under Shared Calendars you should now see an additional calendar with the person's name.
++
+### Add files
+
+Open the **Files** tab in your application and select **Upload** to upload files from OneDrive for Business or from your computer. When a file is successfully uploaded, the main list view automatically refreshs to show the files in the list.
++
+### Approvals
+
+Approvals allow users to request sign out from others when working in a record. For example, request an approval to complete a task or close a record.
+
+1. Go to the **Approvals** tab of the application.
+
+1. When there are no approval requests, users see the following screen.
+
+ :::image type="content" source="../assets/images/collaboration-control/no-approvals.png" alt-text="The screenshot is an example that shows no approval requests.":::
+
+1. Select the **New approval request** to open the approval request form.
+
+ :::image type="content" source="../assets/images/collaboration-control/approval-request-form.png" alt-text="The screenshot is an example that shows the new approval request form.":::
+
+1. In the Approval request form, fill the required fields and select **Send**,which creates a request and added to the list.
+
+ :::image type="content" source="../assets/images/collaboration-control/approvals-list.png" alt-text="The screenshot is an example that shows the list of approvals.":::
+
+1. Select the approval to view the details.
+
+For more information on Approvals, See [create an approval](https://support.microsoft.com/en-us/office/create-an-approval-6548a338-f837-4e3c-ad02-8214fc165c84).
platform Collaboration Api Reference https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/collaboration-api-reference.md
+
+ Title: Collaboration control and Settings REST API references
+
+description: In this module, learn about Collaboration control and settings REST API reference to manage settings, start, map, and retrieve collaboration activities.
+ms.localizationpriority: medium
++++
+# Collaboration control and Settings REST API reference
+
+Developers can use the Collaboration control and Settings REST API to manage settings, start, map, and retrieve collaboration activities with their own business model entities.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+This article provides reference for the Collaboration control solution REST API.
+
+## REST Operations: Collaboration - Custom API
+
+|Operation|Description|
+||--|
+|[Associate Collaboration Map](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/associate-collaboration-map)|Associates a collaborative entity to a collaboration session.|
+|[Begin Collaboration Session](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/begin-collaboration-session)|Creates a collaboration session record linked to a business entity, application context, and optional metadata.|
+|[Disassociate Collaboration Map](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/disassociate-collaboration-map-custom-api)|Disassociates a mapped entity from the given collaboration session.|
+|[Retrieve Collaboration Maps](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/retrieve-collaboration-maps-custom-api)|Gets a list of collaboration maps for a session of a specific entity type.|
+|[Retrieve Collaboration Session](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/retrieve-collaboration-session-custom-api)|Gets a collaboration session record based on the parameters provided.|
+|[Update Collaboration Map](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/update-collaboration-map-custom-api)|Updates a collaboration map record and its metadata if provided.|
+|[Update Collaboration Session](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/update-collaboration-session)|Updates a collaboration session record and optionally its metadata.|
+
+## REST Operations: Collaboration - Standard OData APIs
+
+|Operation|Description|
+||--|
+|[Get Collaboration Map By Id](/rest/api/industry/collaboration-toolkit/collaboration-standard-o-data-ap-is/get-collaboration-map-by-id)|Gets the details from a collaboration map record.|
+|[Get Collaboration Metadata](/rest/api/industry/collaboration-toolkit/collaboration-standard-o-data-ap-is/get-collaboration-metadata)|Gets a list of the collaboration metadata records for a given collaboration map or a collaboration root entity name.|
+|[Get Collaboration Root](/rest/api/industry/collaboration-toolkit/collaboration-standard-o-data-ap-is/get-collaboration-root)|Lists all the collaboration sessions created.|
+
+## REST Operations: Settings - Custom APIs
+
+|Operation|Description|
+||--|
+|[Create and Update Settings](/rest/api/industry/collaboration-toolkit/settings-custom-ap-is/create-update-setting-custom-api)|Creates or updates a setting that matches both the group path and the settings definition name.|
+|[Retrieve Null Settings](/rest/api/industry/collaboration-toolkit/settings-custom-ap-is/retrieve-null-settings-custom-api)|Returns a list of settings definitions that do not have a value.|
+|[Retrieve Settings](/rest/api/industry/collaboration-toolkit/settings-custom-ap-is/retrieve-settings-custom-api)|Returns a list of specific settings or settings in groups.|
+
+## REST Operations: Settings - Standard OData APIs
+
+|Operation|Description|
+||--|
+|[Delete Settings Definition](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/delete-settings-definition)|Deletes a settings definition.|
+|[Delete Settings Group](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/delete-settings-group)|Deletes a settings group.|
+|[Delete Settings Type](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/delete-settings-type)|Delete a settings type.|
+|[Delete Settings Value](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/delete-settings-value)|Deletes a settings value.|
+|[Get Settings Definitions](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/get-settings-definitions)|Lists settings definitions.|
+|[Get Settings Groups](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/get-settings-groups)|Lists settings groups.|
+|[Get Settings Types](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/get-settings-types)|Lists settings types.|
+|[Get Settings Value](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/get-settings-value)|Lists settings values.|
+|[Patch Settings Definition](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/patch-settings-definition)|Updates a settings definition.|
+|[Patch Settings Group](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/patch-settings-group)|Updates a settings group.|
+|[Patch Settings Type](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/patch-settings-type)|Updates a settings type.|
+|[Patch Settings Value](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/patch-settings-value)|Updates a setting value.|
+|[Post Settings Definition](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/post-settings-definition)|Creates a new settings definition.|
+|[Post Settings Group](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/post-settings-group)|Creates a new settings group.|
+|[Post Settings Type](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/post-settings-type)|Creates a new settings type.|
+|[Post Settings Value](/rest/api/industry/collaboration-toolkit/settings-standard-o-data-ap-is/post-settings-value)|Creates a new setting value.|
platform Collaboration Control Power Automate https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/collaboration-control-power-automate.md
+
+ Title: Power Automate in Collaboration control app
+
+description: In this module, learn about Power Automate in Collaboration control app in Microsoft Teams and how to create an Azure app.
+ms.localizationpriority: medium
++++
+# Power Automate
+
+Power Automate can be used to automate workflows around your Collaboration Manager application. For example, automatically create tasks when a new record is created.
+
+Collaboration control connector enables developers to access Collaboration control APIs by triggers or actions in automated workflows in Microsoft Power Automate, Microsoft Power Apps, and Azure Logic apps.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+In this version, the connector enables makers to set up triggers:
+
+1. When a Collaboration session is created.
+1. When a planner task is created or modified.
+
+It also includes a set of Collaboration controls APIs and tasks that can be invoked with a flow. The connector actions is found in workflow step selections. The connector itself would be found on Custom connectors with configurable options. To use the connector in your solution, itΓÇÖs necessary to create an Azure App trusted by your environment to execute the flows.
+
+## Create an Azure App
+
+In the [Azure portal](https://ms.portal.azure.com/#home) for Azure Active Directory management, sign in to your account with adequate permissions to add a user application to your environment with the following steps:
+
+1. In the home page of Azure portal, select **Azure Active Directory**. In Azure Active Directory, select dropdown list for **Add** and select **App registration**.
+
+ :::image type="content" source="../assets/images/collaboration-control/azure-active-directory-home-portal.png" alt-text="The screenshot is an example that shows how to add a new App Registration":::
+
+ :::image type="content" source="../assets/images/collaboration-control/new-app-registration.png" alt-text="The screenshot is an example that shows how to add new app registration":::
+
+1. In the app registration, set your application name and add the Web redirect URI to `https://global.consent.azure-apim.net/redirect`.
+
+ :::image type="content" source="../assets/images/collaboration-control/register-an-application.png" alt-text="The screenshot is an example that shows how to register an application":::
+
+1. In the Implicit Grant and hybrid flows section, select both Access Tokens and ID tokens.
+
+ :::image type="content" source="../assets/images/collaboration-control/authorisation-endpoint-tokens.png" alt-text="The screenshot is an example that shows the tokens and ID tokens":::
+
+1. Select API Permission in the left pane and select **Add a permission**, and then search for **Dynamic CRM** permission.
+
+ :::image type="content" source="../assets/images/collaboration-control/dynamic-crm.png" alt-text="The screenshot is an example that shows how to add a permission":::
+
+1. Ensure to select **user_impersonation** in Permissions after selecting the Dynamics CRM.
+
+ :::image type="content" source="../assets/images/collaboration-control/admin-consent-required.png" alt-text="The screenshot is an example that shows how to enable the checkbox user_impersonation":::
+
+1. In the Certificates & Secrets page, add a **New client secret** and save the value for later use while setting up the connector security.
+
+ :::image type="content" source="../assets/images/collaboration-control/copy-new-secret-value.png" alt-text="The screenshot is an example that shows how to copy new secret value":::
+
+1. In the application Overview page, copy the **Application (client) ID** and save it for later use while setting up the connector security.
+
+ :::image type="content" source="../assets/images/collaboration-control/application-client-ID.png" alt-text="The screenshot is an example that shows how to save client ID":::
+
+Now your Azure app is all set and you need to add it as a user application in your environment.
+
+## Add Azure app to Power Automate environment
+
+1. Open Power Apps portal, in the upper right corner select **settings** and open **Admin center**.
+
+ :::image type="content" source="../assets/images/collaboration-control/power-apps-interface.png" alt-text="The screenshot is an example that shows the Power apps interface":::
+
+1. In the admin center, select **Environment** from the left pane and select your environment in the list that you want to add the connector app.
+
+ :::image type="content" source="../assets/images/collaboration-control/power-platform-admin-center.png" alt-text="The screenshot is an example that shows how to add connector app":::
+
+1. In the environment details page, select **Settings**.
+
+ :::image type="content" source="../assets/images/collaboration-control/settings-environment.png" alt-text="The screenshot is an example that shows how to select settings":::
+
+1. In the settings details page, select **Users + permissions** section and select **Application users**.
+
+ :::image type="content" source="../assets/images/collaboration-control/users-link.png" alt-text="The screenshot is an example that shows the application user link":::
+
+1. In the App users page, select the **+ New app user**. **Create a new app user** window appears.
+
+ :::image type="content" source="../assets/images/collaboration-control/new-app-user.png" alt-text="The screenshot is an example that shows the new app user":::
+
+1. Select **+ Add an app**.
+
+ :::image type="content" source="../assets/images/collaboration-control/create-new-app-user.png" alt-text="The screenshot is an example that shows how to create new app user":::
+
+1. Select your app from the search box and select add again.
+
+ :::image type="content" source="../assets/images/collaboration-control/add-app-aad.png" alt-text="The screenshot is an example that shows how to add app from Azure Active Directory":::
+
+After the app is added, set the **Business unit** and **Security Roles** to your connector application. Select **Create** and your app will be in the list. With the app user set in the environment, we can proceed to custom connector configuration.
+
+## Custom connector configuration
+
+1. Open PowerApps or Power Automate and select the **Custom Connectors** menu. Select **edit** for the Collaboration connector.
+
+ :::image type="content" source="../assets/images/collaboration-control/collaboration-connector.png" alt-text="custom connector menu":::
+
+1. In the General Information tab, enter the host with the address of Dynamic 365 instance domain (without the https://).
+
+ :::image type="content" source="../assets/images/collaboration-control/general-information.png" alt-text="The screenshot is an example that shows the General information":::
+
+1. In the Security tab, enter the following inputs:
+
+ * Client secret: Use your saved app secret value in the input.
+ * Client ID: Your Azure app (Client ID).
+ * Resource URL: The URL of your Dynamic 365 instance (`https://org.crm.dynamics.com/`).
+ * Scope: Same as above with. Default suffix (`https://org.crm.dynamics.com/.default`).
+
+ :::image type="content" source="../assets/images/collaboration-control/dynamic-365-instance.png" alt-text="The screenshot is an example that shows the Dynamic 365 instance.":::
+
+1. Select **Update connector** to save the changes and allow your flow to establish connections.
+
+ :::image type="content" source="../assets/images/collaboration-control/custom-connector.png" alt-text="he screenshot is an example that shows the custom connector.":::
+
+## How to invoke the connectorΓÇ»
+
+Triggers and actions are pre-defined with configurable input and output as a workflow step. Adding the workflow step to the proper workflow position with correct input and output configuration to define when the trigger or action is to be invoked.
+
+ :::image type="content" source="../assets/images/collaboration-control/invoke-the-connector.png" alt-text="The screenshot is an example that shows how to invoke the connector.":::
+
+### Triggers and actions supported with connector
+
+The following triggers and actions are supported within a flow:
+
+* **Triggers**
+
+ 1. When a Collaboration Session is Created.
+
+ :::image type="content" source="../assets/images/collaboration-control/colab-session-created-preview.png" alt-text="Collaboration session created":::
+
+ **Scope:** A scope to limit, which rows can trigger the flow.
+
+ **Run as:** The running user for steps where invoker connections are used.
+
+ 1. When a Task is created or modified
+
+ :::image type="content" source="../assets/images/collaboration-control/task-created.png" alt-text="The screenshot is an example that shows the task is created or modified":::
+
+ By default, the trigger Planner Task will be disabled and won't trigger. To enable it the following steps must be completed by the tenant admin:
+
+ * Create a support ticket under the path Power Apps/Collaboration controls/Settings.
+ * Request that your environment is enabled for the Collaboration connector and provides your Environment URL (preferred) or Organization ID.
+ * You can add the following sample text to your support request: "Enable Environment URL: `url` for the Collaboration Connector".
+ * To open a support ticket, see [Get Help + Support](/power-platform/admin/get-help-support)
+
+* **Actions**
+
+ 1. Begin Collaboration session
+
+ :::image type="content" source="../assets/images/collaboration-control/begin-collab-session.png" alt-text="The screenshot is an example that shows how to begin collaboration session":::
+
+ This step action creates a new collaboration session for your dataverse business entity:
+
+ * **Application Name:** Name of the associated application, for example, could be ΓÇ£Collaboration Manager for LoansΓÇ¥ or ΓÇ£Collaboration Manager for Closed Loan AuditingΓÇ¥.
+ * **Collaboration Root Entity Name:** Type of application record (table name) for example, could be ΓÇ£msfi_loanapplicationΓÇ¥ for a Collaboration Manager for Loans application.
+ * **Collaboration Root Entity ID:** ID of the associated application record, e.g.could be the ID of a Loan Application record.
+
+ ***Advanced options***
+
+ **Metadata (Advanced):** Adds metadata for a collaboration session.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and need to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute.
+ * **Value:** Value associated with the metadata attribute.
+
+ 1. Retrieve Collaboration session
+
+ ::image type="content" source="../assets/images/collaboration-control/retrieve-collab-session.png" alt-text="The screenshot is an example that shows how to Retrieve collaboration session.":::
+
+ This step action returns the collaboration session that matches the provided inputs:
+
+ * **Application Name:** The application name context for the collaboration session.
+ * **Collaboration Root Entity ID:** The business entity ID for the collaboration session.
+ * **Collaboration Root Entity Name:** The business entity type for the collaboration session.
+
+ 1. Update Collaboration session
+
+ :::image type="content" source="../assets/images/collaboration-control/update-collab-session.png" alt-text="The screenshot is an example that shows how to update collaboration session.":::
+
+ This step action updates an existing collaboration session:
+
+ * **Collaboration Root ID:** The GUID for the target collaboration session/root record.
+ * **Collaboration Root Entity ID:** The business entity ID that the collaboration session refers to.
+ * **Collaboration Root Entity Name:** The business entity type name that the collaboration session refers to.
+
+ ***Advanced options:***
+
+ **Create Metadata (Advanced):** Adds more metadata to a collaboration session record.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute.
+ * **Value:** Value associated with the metadata attribute.
+
+ **Update Metadata (Advanced):** Updates existing metadata on a collaboration session record.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute to update.
+ * **Value:** Value associated with the metadata attribute.
+
+ **Delete Metadata (Advanced):** Removes any existing metadata on a collaboration session record.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute to remove.
+
+ 1. Associate Collaboration Map (external)
+
+ :::image type="content" source="../assets/images/collaboration-control/associate-collab-map.png" alt-text="The screenshot is an example that shows how to associate collaboration map.":::
+
+ This step action creates a mapping of an external collaboration entity (outside dataverse) with your collaboration session:
+
+ * **Collaboration Root ID:** The collaboration session unique identifier to map to a collaborative entity.
+ * **Collaboration Map External ID:** The external collaborative resource ID to map.
+ * **Collaboration Map Entity Name:** The external collaborative entity type name to map.
+
+ ***Advanced options:***
+
+ **Metadata:** Add metadata for a collaboration map.
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute.
+ * **Value:** Value associated with the metadata attribute.
+
+ 1. Associate Collaboration Map (internal)
+
+ :::image type="content" source="../assets/images/collaboration-control/associate-collab-map-internal.png" alt-text="The screenshot is an example that shows how to associate collaboration map internal.":::
+
+ This step action creates a mapping of a collaboration entity (dataverse table) with your collaboration session. Internal are intended to create mappings between internal Dataverse entities/tables only.
+
+ * **Collaboration Root ID:** The collaboration session unique identifier to map to a collaborative entity.
+ * **Collaboration Map Entity ID:** The Dataverse collaborative entity ID to map.
+ * **Collaboration Map Entity Name:** The Dataverse collaborative entity type name to map.
+
+ ***Advanced options:***
+
+ **Metadata (Advanced)** Add metadata for a collaboration map.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata
+ * **Key:** Key associated with the metadata attribute
+ * **Value:** Value associated with the metadata attribute
+
+ 1. Update Collaboration Map
+
+ :::image type="content" source="../assets/images/collaboration-control/update-collab-map.png" alt-text="The screenshot is an example that shows how to update collaboration map.":::
+
+ This step action updates an existing collaboration map:
+
+ * **Collaboration Map ID:** The collaboration map unique identifier to update.
+ * **Collaboration Map Entity ID:** The collaborative entity ID to map. This value must be empty if the external ID is Provided
+ * **Collaboration Map Entity Name**
+ * **Collaboration Map External ID:** The external collaborative resource ID to map. This value must be empty if the entity ID is provided.
+
+ ***Advanced options:***
+
+ **Create Metadata:** Adds more metadata to a collaboration map record.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute.
+ * **Value:** Value associated with the metadata attribute.
+
+ **Update Metadata:** Updates existing metadata on a collaboration map record.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata
+ * **Key:** Key associated with the metadata attribute to update
+ * **Value:** Value associated with the metadata attribute
+
+ **Delete Metadata:** Removes any existing metadata on a collaboration map record.
+
+ * **OData Type:** This field needs to be provided if the other key/value are set and needs to match exactly #Microsoft.Dynamics.CRM.m365_collaborationmetadata.
+ * **Key:** Key associated with the metadata attribute to remove.
+
+ 1. Get Collaboration Metadata
+
+ :::image type="content" source="../assets/images/collaboration-control/get-collab-metadata.png" alt-text="The screenshot is an example that shows how to get collaboration metadata.":::
+
+ This step action lists all metadata matching the specified filter.
+
+ **Filter:** A filter to apply to the metadata query.
+ Example retrieving all metadata related to a collaboration map entity ID
+ m365_entityname eq 'm365_collaborationmap' and m365_entityid eq 'GUID'
+
+ 1. Create Planner Task
+
+ :::image type="content" source="../assets/images/collaboration-control/create-planner-task.png" alt-text="The screenshot is an example that shows how to create planner task.":::
+
+ This step action creates a Graph Planner Task using Collaboration controls Planner task virtual table:
+
+ * **Collaboration Root ID (Required):** Collaboration session unique identifier
+ * **Plan ID (Required):** Plan ID that the task belongs
+ * **Title (Required):** Title of the task
+ * **Assignments:** A json formatted object that represents all the assignments of a Task. See, [plannerAssignments resource type](/graph/api/resources/plannerassignments)
+ * **Bucket ID:** Bucket ID to which the tasks belong.
+ * **Priority:** Priority of the task. 0 and 10 (inclusive) increasing value being lower priority.
+
+ ***Advanced options:***
+
+ * **Active Checklist Item Count** (Advanced): Number of checklist items with value set to false representing incomplete items.
+ * **Applied Categories:** A json formatter object that represents all the categories to apply for the task. See, [plannerAppliedCategories resource type](/graph/api/resources/plannerappliedcategories).
+ * **Assignee Priority:** String value hints used to order items of this type in a list view. See, [using order hints in Planner](/graph/api/resources/planner-order-hint-format)
+ * **Checklist Item Count:** Number of checklist items that are present on the task.
+ * **Completed By:** A json formatted object that represents the identity of the user that completed the task. See, [identitySet resource type](/graph/api/resources/identityset)
+ * **Conversation Thread ID:** Thread ID of the conversation on the task. This is the ID of the conversation thread object created in the group.
+ * **Created By:** A json formatted object that represents the identity of the user that created the task. See, [identitySet resource type](/graph/api/resources/identityset)
+ * **Due Date Time:** Date and time at which the task is due. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on January 1, 2014 is 2014-01-01T00:00:00Z.
+ * **Order Hint:** Hint used to order items of this type in a list view. The format is defined as outlined in [using order hints in Planner](/graph/api/resources/planner-order-hint-format).
+ * **Percent Complete:** Percentage of task completion (0-100)
+ * **Preview Type:** This sets the type of preview that shows up on the task. The possible values are: automatic, noPreview, checklist, description, reference.
+ * **Reference Count:** Number of external references that exist on the task.
+ * **Start Date Time:** Date and time at which the task starts. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z.
+
+ 1. Get Planner Task
+
+ :::image type="content" source="../assets/images/collaboration-control/get-planner-task.png" alt-text="The screenshot is an example that shows the get planner task.":::
+
+ This step action returns a Planner Task data using Collaboration controls Planner task virtual table:
+
+ **Task ID (Required):** Task unique identifier
+
+ 1. Update Planner Task
+
+ :::image type="content" source="../assets/images/collaboration-control/update-planner-task-preview.png" alt-text="Update planner task":::
+
+ This step action updates a planner task record using Collaboration controls Planner task virtual table
+
+ * **Task ID (Required):** Task unique identifier.
+ * **Assignments:** A json formatted object that represents all the assignments of a Task. See. plannerAssignments resource type - Microsoft Graph v1.0 | Microsoft Docs
+ * **Bucket ID:** Bucket ID to where the task belongs.
+ * **Planner Task Details:** Represents the additional information about a task.
+ * **Due Date Time:** Date and time at which the task is due. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on January 1, 2014 is 2014-01-01T00:00:00Z.
+ * **Priority:** Priority of the task. 0 and 10 (inclusive) increasing value being lower priority.
+ * **Percent Complete:** Percentage of task completion (0-100)
+ * **Title:** Title of the task
+
+ ***Advanced options:***
+
+ * **Applied Categories:** A json formatted object that represents all the categories to apply for the task. See, [plannerAppliedCategories resource type](/graph/api/resources/plannerappliedcategories).
+ * **Assignee Priority:** String value hints used to order items of this type in a list view. See, [using order hints in Planner](/graph/api/resources/planner-order-hint-format).
+ * **Conversation Thread ID:** Thread ID of the conversation on the task. This is the ID of the conversation thread object created in the group.
+ * **Collaboration Root ID:** The collaboration session unique identifier.
+ * **Order Hint:** Hint used to order items of this type in a list view. The format is defined as outline here.
+ * **Start Date Time:** Date and time at which the task starts. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on January 1, 2014 is 2014-01-01T00:00:00Z.
+
+**Example Flow Scenario**
+
+The following are some example of flows:
+
+1. Getting a response from Microsoft forms, creating a Collaboration session and a task associated.
+
+ :::image type="content" source="../assets/images/collaboration-control/response-submitted.png" alt-text="The screenshot is an example that shows how to submit new response.":::
+
+1. Every time a collaboration session is created, capture the details and send an e-mail notification.
+
+ :::image type="content" source="../assets/images/collaboration-control/colab-session-created-preview.png" alt-text="The screenshot is an example that shows the Collaboration session created":::
+
+> [!NOTE]
+> Multiple flows could be triggered in this way to perform different actions, using data from the response of the Collaboration session creation.
platform Collaboration Control https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/collaboration-control.md
+
+ Title: Collaboration controls
+
+description: In this module, learn how Collaboration controls allow makers to build apps that integrate with Microsoft 365 services like Planner, Bookings, and Outlook.
+ms.localizationpriority: medium
++++
+# Collaboration controls
+
+The Collaboration controls enable applying Microsoft 365 and Microsoft Teams for Approvals, Files, Meetings, Notes, and Tasks to enable contextual collaboration around business processes. These controls allow you to build custom collaborative experiences that can be surfaced right in Teams. The solutions that make up Collaboration controls allow makers to build applications that integrate with Microsoft 365 services like Planner, Bookings, Outlook, and SharePoint in a low code manner.
+
+These controls give you the power to simplify your users workflow collaboration by building line of business apps with Approvals, Files, Meetings, Notes, and Tasks without switching the context from app to app.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+Following are some of the key capabilities of Collaboration controls:
+
+* **Microsoft Planner tasks:** Create tasks and assign it to members of a record so that they can view a consolidated list of tasks in model driven app and tasks app in Microsoft Teams.
+
+* **Dataverse Tasks:** Create tasks that can be assigned to users who are external to your organization.
+
+* **Dataverse Notes:** Create notes that are assigned to a record in your app.
+
+* **Outlook Meetings:** Schedule meetings with both customers and internal employees and seamlessly connect with others with Microsoft Teams with a select of a button.
+
+* **SharePoint Files:** Share files with members of a record so that you can search, reference, and edit relevant artifacts in a centralized location backed by SharePoint.
+
+* **Approvals:** Streamline requests within your team.
+
+> [!NOTE]
+> By configuring and using the various Microsoft 365 capabilities of Collaboration controls mentioned above, you are granting permission for user data to pass through the Graph API and agreeing to [Microsoft API terms of Use](/legal/microsoft-apis/terms-of-use?context=graph%2Fcontext). For more information, see [Microsoft Graph](/graph/overview).
+
+## How Collaboration controls works
+
+The controls run within a Power Apps Model Driven Application [MDA] that can be deployed to Microsoft Teams. MDA run on Microsoft Dataverse and can be integrated with a custom data model. The controls integrate with Microsoft Graph for Planner tasks, Outlook and Teams calendars, and SharePoint files. The Collaboration controls don't integrate directly with external sources, such as a system of record or a portal.
+
+* Data can be added to Dataverse from external sources via standard OData APIs.
+
+* Data can be read from Dataverse via standard OData APIs and submitted to external sources such as a system of record or a portal.
+
platform Collaboration Controls Limitations https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/collaboration-controls-limitations.md
+
+ Title: Limitations and known issues in Collaboration control app
+
+description: In this module, learn about limitations and known issues in Collaboration controls app for Microsoft Teams.
+ms.localizationpriority: medium
++++
+# Limitations and known issues
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+Following are the limitations for Collaboration controls:
+
+* Components can't be used in Canvas apps.
+* Components only support full tab views.
+
+ :::image type="content" source="../assets/images/collaboration-control/tasks-tab.png" alt-text="tasks" border="true":::
+
+* The subgrid view selected isn't honored. All tasks, meetings, or notes for the collaborative record will be displayed.
+
+ :::image type="content" source="../assets/images/collaboration-control/subgrid-view.png" alt-text="subgrid view" border= "true":::
+
+* Activities added to the timeline control donΓÇÖt appear in the components, tasks, meetings and notes created in the components aren't included in the timeline control.
+* New records must be saved before accessing the components, otherwise you'll see an empty screen.
+* The components don't inherit theming from the form or app they're added to.
+* Localization is only available when running the app inside Microsoft Teams.
+* Microsoft Edge strict mode isn't supported and cross-site cookies are required.
+
+**Admin Center does not update when installation or upgrade is complete**
+
+When following the installation steps in [install Collaboration controls](~/samples/install-collaboration-control.md), you're redirected to the Power Platform admin center. A banner is displayed when installation starts, but it isn't updated when installation completes. The status is listed during installation and when installation is complete it may disappear from the list. You can view the solutions list at [https://make.powerapps.com/](https://make.preview.powerapps.com/) to confirm that installation is complete.
+
+**View during installation:**
+ :::image type="content" source="../assets/images/collaboration-control/view-during-installation.png" alt-text="view during installation" border="true":::
+
+**View after installation:**
+ :::image type="content" source="../assets/images/collaboration-control/view-after-installation.png" alt-text="view after installation" border="true":::
+
+When upgrading the controls to a later version, the same installation started banner displays, but the control status remains installing even after the upgrade is complete. You can confirm that the upgrade is complete by checking the solutions list at [https://make.powerapps.com/](https://make.preview.powerapps.com/), it should take approximately 15 minutes.
+
+You can also see in the history for specific solutions that the later version was installed and then the previous version was removed:
+ :::image type="content" source="../assets/images/collaboration-control/history.png" alt-text="History check" border="true":::
+
+## Bookings Meetings
+
+The Meetings control supports one on one meetings when using Bookings to engage with users outside of your organization. one to many meetings aren't supported at this time using Collaboration controls.
+
+**Meeting attendee status is incorrect**
+
+When an attendee RSVPs to a meeting, their response status may not display correctly in both the agenda view and the meeting details. Selecting the decline button may also return an error message on screen.
+
+## Tasks
+
+**Tasks: Filter "clear" text is not translated**
+
+The text on the ΓÇ£clear" button displayed on the Tasks filter isn't translated.
+
+**Tasks: Grid context menu appears cropped**
+
+When, the Tasks grid is populated by a low number of Tasks the grid context menu may appear cropped and require use of scrollbars.
+
+**Tasks: Keyword search filter use ΓÇ£BeginsWithΓÇ¥ operator for ΓÇ£GuestΓÇ¥ tasks**
+
+When search Tasks using the keyword text filter, ΓÇ£GuestΓÇ¥ tasks are returned using the ΓÇ£BeginsWithΓÇ¥ operator. ΓÇ£MemberΓÇ¥ tasks are returned using the ΓÇ£ContainsΓÇ¥ operator.
+
+## Files
+
+When navigating into the Archive folder after archiving files, users may experience duplicate archive folders. Navigating from the archive folder(s) to the files main view will resolve the issue, and files that are archived won't be removed.
+
+## Controls
+
+**Controls fail to save**
+
+If a control fails to save a task or meeting, the likely cause is misconfigured Group ID or Channel ID.
+
+Solution 1: Confirm the IDs are correct, and the settings have been applied as per the settings exercise.
+
+Solution 2: Try to ensure that the Power Apps environment and Teams environment are on the same tenant.
+
+**Controls fail to load or show an error**
+
+If the controls fail to load or show an error, it may be a transient issue.
+
+Example:
++
+This would render in the console log as:
++
+Solution: Refresh your browser or if in Teams app, reload the tab.
+
+If you want to change the app name, icon, or description after uploading it to Teams, see [customize appearance of apps](/MicrosoftTeams/customize-apps#customize-details-of-an-app)
+
+## Error logging
+
+The controls provide the following methods to debug your application.
+
+1. **Trace logging** of plugin events when an API is invoked. This information is stored in your Dataverse environment.
+
+ 1. To enable trace logging follow these steps in [logging and tracing](/power-apps/developer/data-platform/logging-tracing?WT.mc_id=email).
+
+1. **Browser logging** for UI controls. This is standard console logging.
+
+ 1. It's supported when using a browser to run the Collaboration Manager app via Power Platform and Teams web.
+ 1. Within the console tab, you can search for errors using the Collaboration Manager error message or searching for Collaboration Manager control names such as Tasks.
+
+> [!TIP]
+> If an error occurs in a Teams desktop client, try to replicate in Teams web to capture the error log.
+
+## FAQ
+
+<br>
+
+<details>
+
+<summary><b>What are the Collaboration controls (Preview)?</b></summary>
+
+Collaboration controls (Preview) enable you to add Microsoft 365 capabilities to your Power Apps line of business custom applications to simplify user workflows when collaborating on business processes in Teams or Power Apps.
+
+<br>
+
+</details>
+
+<br>
+
+<details>
+
+<summary><b>What is the benefit of the Collaboration controls (Preview) for makers?</b></summary>
+
+With these new controls, you as a maker can drag-and-drop controls that bring Microsoft 365 collaboration to your app.
+
+<br>
+
+</details>
+
+<br>
+
+<details>
+
+<summary><b>What is the benefit of the Collaboration controls (Preview) for users?</b></summary>
+
+Your users can experience productivity gains and stay in their flow by collaborating on approvals, files, meetings, notes and tasks without leaving the context of your app.
+
+<br>
+
+</details>
+
+<br>
+
+<details>
+
+<summary><b>How do I get access to the Collaboration controls (Preview)?</b></summary>
+
+Request that your Power Platform administrator install the controls from AppSource to your Power Apps environment.
+
+<br>
+
+</details>
+
+<br>
+
+<details>
+
+<summary><b>How do I add the controls to a Model Driven App?</b></summary>
+
+Navigate to Form Designer and drag the controls from the Component pane onto a form.
+
+<br>
+
+</details>
platform Configure Tasks https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/configure-tasks.md
+
+ Title: Configure Tasks for external clients in Collaboration control app
+
+description: In this module, learn how to configure Tasks for external clients in Collaboration control app in Microsoft Teams.
+ms.localizationpriority: medium
++++
+# Configure Tasks for external clients
+
+External tasks that can be assigned to users who aren't part of your organization or don't have access to your application such as assigning a task to a customer.
+
+To enable, you'll need an extra step of passing an XML string to each instance of Tasks PCF control attached to the sub grid component on desired MDA form. XML string is a parametrized query that allows the control to extract the required data from a table that contains customer information.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+Following are the steps to create external tasks:
+
+1. Create a new custom entity such as Customer or reuse an existing customer entity like Contacts.
+
+1. Create new fields that will hold the following information:
+ 1. Name
+ 1. Email
+ 1. Parent (Lookup to the parent table such as Inspections)
+ > [!NOTE]
+ > The customer entity created above will be, where the task control pulls the customer information from when assigning an external task. The Parent field ensures that the customer entity is linked to an Inspection record.
+
+1. Generate a Fetch XML file to allow the PCF control to pull the right customer information.
+
+ **Configure XML schema**
+
+ Following is the schema definition for the tasks configuration Fetch XML. Any Fetch XML needs to be designed to meet the following requirements:
+
+ * Query result shall return the following properties for each user object:
+ * ID
+ * displayname
+ * email, use alias if needed.
+ * Query shall contain the **@top** parameter to allow caller to limit the number of results.
+ * Query shall have **@rootEntityId** parameter to filter results by only related records, if needed.
+ * Query shall have **@useName** parameter to allow result filtering by name
+ * Query shall have **@useIdentifier** parameter to allow fetching only selected users.
+
+ **Configuration XML schema and example**
+
+ Configuration of XML schema pulls data from the customer table. You can adjust the `<fetch/>` node to specify your own query to display users from any other custom table.
+
+ > [!NOTE]
+ > The above entity and attribute name and order attribute in the XML are in **PublisherPrefix_TableColumn** format.
+
+ ```xml
+
+ <custom-tasks>
+ <custom-task id="external" name="External" for="guest">
+ <fetch top="@top">
+ <entity name="[Name of table, e.g. Crb2891_customer]">
+ <attribute name="[Name of ID column, e.g. Crb2891_customerid]" alias="id" />
+ <attribute name="[Name of primary name column, e.g. Crb2891_name]" alias="displayname" />
+ <attribute name="[Name of email column, e.g. Crb2891_email]" alias="email" />
+ <order attribute ="[Name of primary name column, e.g. Crb2891_name]" descending="false" />
+ <filter type="and">
+ <condition attribute="[Name of parent lookup column, e.g. Crb2891_parent]" operator="eq" value="@rootEntityId" />
+ <condition attribute="[Name of primary name column, e.g. Crb2891_name]" operator="like" value="@userName" />
+ <condition attribute="[Name of email column, e.g. Crb2891_email]" operator="like" value="@userIdentifier" />
+ </filter>
+ </link-entity>
+ </entity>
+ </fetch>
+ </custom-task>
+ </custom-tasks>
+
+ ```
+
+1. Bind the Task controls to the subgrid within the classic form designer. Select **Save** and then select **Switch to classic**.
+
+1. Move through in the classic form designer, until you find the **Tasks** tab. Double-click the subgrid to open its property dialog.
+
+ :::image type="content" source="~/assets/images/collaboration-control/subgrid-property.png" alt-text="Tasks property dialog":::
+
+1. In the property dialog, set the properties as shown in the following image:
+
+ :::image type="content" source="~/assets/images/collaboration-control/tasks-property.png" alt-text="Tasks property settings":::
+
+1. Go to the Controls tab and select :::image type="icon" source="~/assets/images/collaboration-control/edit-icon.png" alt-text="edit tasks"::: on Custom Tasks property to add the Fetch XML generated above.
+
+1. Paste the Fetch XML
+
+ :::image type="content" source="~/assets/images/collaboration-control/set-fetchproperties.png" alt-text="Fetch XML property settings":::
+
+ :::image type="content" source="~/assets/images/collaboration-control/custom-tasksproperty.png" alt-text="Fetch XML Custom property settings":::
+
+1. Select **Ok** in Configure Property "Custom Tasks" and Set Properties windows.
+
+1. Save and Publish.
platform Deploy Collaboration Control In Teams https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/deploy-collaboration-control-in-teams.md
+
+ Title: Deploy an app with Collaboration controls in Microsoft Teams
+
+description: In this module, learn how to deploy your app with Collaboration control in Microsoft Teams and how to enable others to use your app.
+ms.localizationpriority: medium
++++
+# Deploy Collaboration controls to Microsoft Teams
+
+Collaboration controls currently work best within Microsoft Teams. You can create a new app that can be embedded inside Teams app as both, a personal app and a tab app.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+## Configure the app for Teams
+
+The app that you've created in [create a model-driven application](/samples/app-with-collaboration-controls.md#create-a-model-driven-application) only have a single left pane and there are no complex commands. So before adding your app into Teams, you can hide the left pane and make more comprehensible header view.
+
+> [!NOTE]
+> Don't enable the following steps if you want to display the left pane and high-density header to your users.
+
+To do so, we'll use Power Apps **new app** settings.
+
+1. Go to **Solutions** in the left pane.
+
+1. Go to the bottom of your solutions list and select **Default solution**.
+
+1. Search for and select **Setting definition**.
+
+ :::image type="content" source="../assets/images/collaboration-control/settings-defnition.png" alt-text="Setting definition":::
+
+1. Search and select **Hide the navbar** from the list of settings definitions. This hides the left pane in your application.
+
+ :::image type="content" source="../assets/images/collaboration-control/hide-the-nav-bar.png" alt-text="Hide the nav bar":::
+
+1. On the lower right of your application in the edit pane, there's a section titled **Setting app values**. If you created your app using the modern app designer, your app appears on the list. Select **New app value** under your app.
+
+1. Change the value from **No** to **Yes.**
+
+ :::image type="content" source="../assets/images/collaboration-control/value-to-yes.png" alt-text="Change value to yes":::
+
+1. Select **Save.**
+
+1. Search and select **App high density page header** from the list of settings definitions and repeat the process.
+
+ :::image type="content" source="../assets/images/collaboration-control/density-page-header.png" alt-text="Density page header":::
+
+1. Select **Back to solutions**.
+
+ :::image type="content" source="../assets/images/collaboration-control/default-solution.png" alt-text="Default solution":::
+
+1. Select **Publish all customizations** to publish all the work you've completed.
+
+ :::image type="content" source="../assets/images/collaboration-control/publish-cusomization.png" alt-text="Publish all customizations":::
+
+## Add the app to Microsoft Teams app catalog
+
+As the settings are defined, you can now add the app to Microsoft Teams. To start with, browse to the **Apps** page in the Power Apps maker portal and find the app that you've created and select ellipse **…**.
+
+To add the app to Teams, select **Add to Teams**.
++
+Selecting **Add to Teams** opens a dialog where you can review the details and select **Download app**, which saves the Microsoft Teams app manifest to your device.
++
+To upload your app to Teams, see [upload your app in Team](~/concepts/deploy-and-publish/apps-upload.md).
+
+## Enable others to use your application
+
+Following are required to enable users to run the deployed Collaboration Manager applications built using the Collaboration controls:
+
+* Create a Collaboration team
+* Add members to the team
+* Create a security role
+* Assign security roles to team members
+
+### Create a Collaboration team
+
+1. Sign into [Power Platform admin center](https://admin.powerplatform.microsoft.com/environments).
+
+ 1. Select the environment where the app is deployed.
+ 1. Select **Settings** > **Users** + **permissions**.
+ 1. Select **Teams**.
+
+1. Select the **+ Create team** button from the top of the page.
+
+1. Add all the required fields:
+ 1. **Team name:** Ensure the name is unique within the business unit.
+ 1. **Description:** Enter a description of the team.
+ 1. **Business unit:** Select a business unit from the dropdown list.
+ 1. **Administrator:** Search for the user within your organization that you want to assign as the administrator by entering characters.
+ 1. **Team type:** Select the team type. The following steps assume that you've selected Owner from the dropdown list. The other team types (Microsoft 365 team and Microsoft Azure Active Directory team) auto populates team members from Azure Active Directory.
+
+ :::image type="content" source="../assets/images/collaboration-control/new-team.png" alt-text="New team":::
+
+ 1. Ensure that you note the team name. You'll need this later to assign this team as the owner of a record.
+
+ 1. Select **Next.**
+
+### Add members to the team
+
+> [!NOTE]
+> Adding members to the team isn't necessary if your team type is Azure Active Directory or Microsoft 365.
+
+1. Select a team, and then select **Manage team members**.
+
+1. To add new team members, select **+ Add team members** and choose users from your organization to add.
+
+ :::image type="content" source="../assets/images/collaboration-control/add-team-members.png" alt-text="The screenshot describes how to add Team members":::
+
+1. To delete a team member, select the user and then choose **Remove**.
+
+### Create a security role
+
+1. Select **Settings** > **Users** + **permissions** in the environment where the app is deployed.
+
+1. Select **Security roles**.
+
+ :::image type="content" source="../assets/images/collaboration-control/users-permission.png" alt-text="Users permission":::
+
+1. Select on **New role** at the upper left of the page, which now opens a new page.
+
+1. On the **Details tab**, provide a name for your security role.
+
+1. Go to **Custom Entities** tab.
+
+ 1. Give organization permissions (full green circle) for each of the collaboration entities, **Collaboration Map**, **Collaboration Metadata**, and **Collaboration Root**.
+
+ :::image type="content" source="../assets/images/collaboration-control/collab-map.png" alt-text="Collaboration map":::
+
+1. Select **Save** and **Close**.
+
+### Assign Security roles
+
+1. Select **Settings** > **Users** + **permissions** in the environment where the app is deployed.
+
+1. Select **Teams**, select then the team you created in [create a Collaboration team](#create-a-collaboration-team).
+
+1. Choose **Manage security roles** from the header.
+
+ :::image type="content" source="../assets/images/collaboration-control/edit-team.png" alt-text="Edit team":::
+
+1. Select the roles [created in a security role](#create-a-security-role).
+
+1. Select **Save**.
+
+For more information on role privileges, see [configure user security in an environment](/power-platform/admin/database-security).
platform Install Collaboration Control https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/install-collaboration-control.md
+
+ Title: Install Collaboration controls
+
+description: In this module, learn how to install Collaboration controls with power apps and Microsoft 365 E3 and how to install collaboration controls solutions.
+ms.localizationpriority: medium
++++
+# Install Collaboration controls
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+In this article, you'll learn how to install Collaboration Controls. The following are required to build and deploy Collaboration Manager applications using the Collaboration controls:
+
+* **Power apps**: To build and run Model Driven Applications using the Collaboration controls.
+* **M365 E3 or higher**: To deploy custom applications to Microsoft Teams and store tasks in Planner, files in SharePoint, and meetings in Outlook.
+
+To install the components into a Power Platform environment the following roles are required:
+
+* System customizer
+* Environment maker
+
+For more information on role privileges, see [Configure user security in an environment](/power-platform/admin/database-security#predefined-security-roles)
+
+## Install the Collaboration controls solutions
+
+You'll install the Collaboration controls into your dataverse environment via a private link. This link must not be shared with any other person inside or outside your organization.
+
+You'll be able to configure and use the components within your own model-driven app only after receiving the link and installing Collaboration controls into your dataverse environment.
+
+Collaboration Controls include the following solutions:
+
+|**Settings solutions** | **Purpose** |
+|||
+| Collaboration controls Settings | Hold the settings infrastructure that powers Collaboration controls |
+| Collaboration controls Settings Objects | Provides pre-defined settings values that are used by the Collaboration controls.|
+
+|**Collaboration solutions** | **Purpose** |
+|||
+| Collaboration controls Tasks | Includes the Tasks PCF (Power Apps component framework) control. |
+| Collaboration controls Events | Includes the Events PCF control for Outlook and Teams meetings and bookings appointments. |
+| Collaboration controls Notes | Includes the notes PCF control, which stores notes in Dataverse. |
+| Collaboration controls Files | Includes the Files PCF control for accessing files on SharePoint. |
+| Collaboration controls Core |Includes custom Collaboration APIs, the Collaboration Data Model and Virtual Tables for Events, Files and Task controls. |
+| Collaboration controls Approvals | Includes the new Approvals PCF control. |
+| Collaboration controls connector | Includes the new Collaboration Power Automate connector |
+
+> [!NOTE]
+> If you have an existing version of the controls installed in your environment, you might need to create a fresh environment and complete a new install to successfully upgrade to the latest version.
+
+Before installation, you must be in a Power Platform environment or admin tenant. You'll need a dataverse environment with a database. If you don't have one, you'll need to [create a new one](/power-platform/admin/create-environment) to continue with the installation.
+
+To install the solutions, begin by browsing to [Microsoft AppSource] and then complete the following steps:
+
+1. Select **Get it now** button.
+
+ :::image type="content" source="../assets/images/collaboration-control/preview-form.png" alt-text="Preview form "border="true":::
+
+1. Sign in with your account, fill in the form and select **Continue**.
+
+ :::image type="content" source="../assets/images/collaboration-control/overview.png" alt-text="overview collaboration control" border="true":::
+
+ :::image type="content" source="../assets/images/collaboration-control/collaboration-controls-preview.png" alt-text="Collaboration control preview" border="true":::
+
+1. You'll be directed to Power Platform Admin Center. Select an environment from the dropdown menu and agree to the terms and policy statements.
+
+ > [!TIP]
+ > If you see a permissions error when you select the environment, try selecting outside the environment dropdown menu to see if that resolves the issue.
+
+ :::image type="content" source="../assets/images/collaboration-control/install-environment.png" alt-text="Install collaboration control environment" border="true":::
+
+1. Select **Install**, installation might take approximately 15 minutes to complete.
+
+1. Go to [https://make.powerapps.com/](https://make.powerapps.com/), [https://make.preview.powerapps.com/](https://make.preview.powerapps.com/) is also supported if you're signed up to Power Apps preview.
+
+1. Ensure that you're in the environment the controls are installed into as you can view the environment and change it if necessary on the top right of the Power Apps portal.
+
+1. Select the **Solutions** tab to view all the solutions that you've installed in the right environment.
+
+ :::image type="content" source="../assets/images/collaboration-control/solutions.png" alt-text="solutions collaboration control" border= "true":::
+
+> [!NOTE]
+> The Collaboration controls are preview and elements may change over time with potential for breaking changes. The Collaboration controls aren't supported in production environments.
+
+After successful installation of all the Collaboration solutions into your environment, you'll be able to build a new model-driven app that can take advantage of the Collaboration control capabilities.
platform Integrating Web Apps https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/integrating-web-apps.md
You can make web apps suitable with Teams' social and collaborative features, by
The different types of apps, which you can integrate with Teams are as follows:
-* **Standalone apps**: A stand alone app is a single-page or large, and complex app. The user can use some aspects of it in Teams.
+* **Standalone apps**: A standalone app is a single-page or large, and complex app. The user can use some aspects of it in Teams.
* **Collaboration apps**: An app already built for the social and collaborative features inherent to Teams. * **SharePoint**: A SharePoint page you want to surface in Teams.
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 message 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've 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 message 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) ### Add Adaptive Cards to your Virtual Assistant
-To dispatch requests properly, your Virtual Assistant must identify the correct LUIS model and corresponding skill associated with it. However, the dispatching mechanism cannot be used for card action activities, as the LUIS model associated with a skill, is trained for card action texts. The card action texts are fixed, pre-defined keywords, and not commented from a user.
+To dispatch requests properly, your Virtual Assistant must identify the correct LUIS model and corresponding skill associated with it. However, the dispatching mechanism can't be used for card action activities, as the LUIS model associated with a skill, is trained for card action texts. The card action texts are fixed, pre-defined keywords, and not commented from a user.
This drawback is resolved by embedding skill information in the card action payload. Every skill should embed `skillId` in the `value` field of card actions. You must ensure that each card action activity carries the relevant skill information, and Virtual Assistant can utilize this information for dispatching.
Additionally, you must include all skill domains in the `validDomains` section i
### Handle collaborative app scopes
-Teams apps can exist in multiple scopes including 1:1 chat, group chat, and channels. The core Virtual Assistant template is designed for 1:1 chats. As part of the onboarding experience Virtual Assistant prompts users for name and maintains user state. Since the onboarding experience is not suited for group chat or channel scopes, it has been removed.
+Teams apps can exist in multiple scopes including 1:1 chat, group chat, and channels. The core Virtual Assistant template is designed for 1:1 chats. As part of the onboarding experience Virtual Assistant prompts users for name and maintains user state. Since the onboarding experience isn't suited for group chat or channel scopes, it has been removed.
-Skills should handle activities in multiple scopes, such as 1:1 chat, group chat, and channel conversation. If any of these scopes are not supported, skills must respond with an appropriate message.
+Skills should handle activities in multiple scopes, such as 1:1 chat, group chat, and channel conversation. If any of these scopes aren't supported, skills must respond with an appropriate message.
The following processing functions have been added to Virtual Assistant core:
Once the commands are invoked by a user, the Virtual Assistant can identify an a
} ```
-Some message extension activities do not include the command ID. For example, `composeExtension/selectItem` contains only the value of the invoke tap action. To identify the associated skill, `skillId` is attached to each item card while forming a response for `OnTeamsMessagingExtensionQueryAsync`. This is similar to the approach for [adding adaptive cards to your Virtual Assistant](#add-adaptive-cards-to-your-virtual-assistant).
+Some message extension activities don't include the command ID. For example, `composeExtension/selectItem` contains only the value of the invoke tap action. To identify the associated skill, `skillId` is attached to each item card while forming a response for `OnTeamsMessagingExtensionQueryAsync`. This is similar to the approach for [adding adaptive cards to your Virtual Assistant](#add-adaptive-cards-to-your-virtual-assistant).
```csharp // Invoked when a 'composeExtension/selectItem' invoke activity is received for compose extension query command.
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)
-Followings are the delta changes introduced to convert it to a skill which is attached to a Virtual Assistant. Similar guidelines are followed to convert any existing v4 bot to a skill.
+Followings are the delta changes introduced to convert it to a skill, which is attached to a Virtual Assistant. Similar guidelines are followed to convert any existing v4 bot to a skill.
### Skill manifest
-A skill manifest is a JSON file that exposes a skill's messaging endpoint, ID, name, and other relevant metadata. This manifest is different than the manifest used for sideloading an app in Teams. A Virtual Assistant requires a path to this file as an input to attach a skill. We have added the following manifest to the bot's wwwroot folder.
+A skill manifest is a JSON file that exposes a skill's messaging endpoint, ID, name, and other relevant metadata. This manifest is different than the manifest used for sideloading an app in Teams. A Virtual Assistant requires a path to this file as an input to attach a skill. We've added the following manifest to the bot's wwwroot folder.
```bash botskills connect --remoteManifest "<url to skill's manifest>" ..
The corresponding `.lu` file is shown in the following section:
``` With this approach, any command issued by a user to Virtual Assistant related to `book room` or `manage favorites` are identified as a command associated with `Book-a-room` bot and is forwarded to this skill.
-On the other hand, `Book-a-room room` bot needs to use LUIS model to understand these commands if they are not typed full. For example: `I want to manage my favorite rooms`.
+On the other hand, `Book-a-room room` bot needs to use LUIS model to understand these commands if they aren't typed full. For example: `I want to manage my favorite rooms`.
### Multi-Language support
In parallel, add corresponding `.lu` file in luisFolder path. Folder structure s
| - book-a-meeting.lu ```
-To modify `languages` parameter, update botskills command as follows:
+To modify `languages` parameter, update bot skills command as follows:
```json botskills connect --remoteManifest "<url to skill's manifest>" --luisFolder "<path to luisFolder>" --languages "en-us, your_language_culture" --cs ```
-Virtual Assistant uses `SetLocaleMiddleware` to identify current locale and invoke corresponding dispatch model. Bot framework activity has locale field which is used by this middleware. You can use the same for your skill as well. Book-a-room bot does not use this middleware and instead gets locale from Bot framework activity's [clientInfo entity](https://github.com/microsoft/botframework-sdk/blob/master/specs/botframework-activity/botframework-activity.md#clientinfo).
+Virtual Assistant uses `SetLocaleMiddleware` to identify current locale and invoke corresponding dispatch model. Bot framework activity has locale field which is used by this middleware. You can use the same for your skill as well. Book-a-room bot doesn't use this middleware and instead gets locale from Bot framework activity's [clientInfo entity](https://github.com/microsoft/botframework-sdk/blob/master/specs/botframework-activity/botframework-activity.md#clientinfo).
### Claim validation
-We have added [claimsValidator](https://github.com/nebhagat/msteams-virtual-assistant-dotnet/blob/master/msteams-virtual-assistant-dotnet/Authentication/AllowedCallersClaimsValidator.cs) to restrict callers to the skill. To allow a Virtual Assistant to call this skill, populate `AllowedCallers` array from `appsettings` with that particular Virtual Assistant's app ID.
+We've added [claimsValidator](https://github.com/nebhagat/msteams-virtual-assistant-dotnet/blob/master/msteams-virtual-assistant-dotnet/Authentication/AllowedCallersClaimsValidator.cs) to restrict callers to the skill. To allow a Virtual Assistant to call this skill, populate `AllowedCallers` array from `appsettings` with that particular Virtual Assistant's app ID.
``` "AllowedCallers": [ "<caller_VA1_appId>", "<caller_VA2_appId>" ],
For more information on adding claims validation to a skill, see [add claims val
### 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`.
+Updating activity, such as card refresh isn't supported yet through Virtual Assistant ([github issue](https://github.com/microsoft/botbuilder-dotnet/issues/3686)). Hence, we've 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.
-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-assistant#add-adaptive-cards-to-your-virtual-assistant) section from this documentation.
### Handle activities from group chat or channel scope
You can also leverage existing skills from [Bot Framework Solutions repository](
## 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.
+* **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's no clear state where conversation is ended. Hence we haven't 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 isn't yet supported through Virtual Assistant.
* **Message extensions**: * Currently, a Virtual Assistant can support a maximum of ten commands for message extensions.
- * Configuration of message extensions is not scoped to individual commands but for the entire extension itself. This limits configuration for each individual skill through Virtual Assistant.
+ * Configuration of message extensions isn't scoped to individual commands but for the entire extension itself. This limits configuration for each individual skill through Virtual Assistant.
* Message extensions command IDs have a maximum length of [64 characters](../resources/schem#composeextensions) and 37 characters are used for embedding skill information. Thus, updated constraints for command ID are limited to 27 characters. 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. Tutorials for the later can be found [here](https://microsoft.github.io/botframework-solutions/overview/skills/). Please refer to [documentation](/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0&preserve-view=true) for Virtual Assistant and skills architecture.
platform Virtual Table Entity References https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-table-entity-references.md
+
+ Title: Virtual table entity references
+
+description: In this module, learn about virtual tables entity reference and their attributes in Microsoft Teams.
+ms.localizationpriority: medium
++++
+# Virtual tables entity reference
+
+Collaboration controls virtual entities and their attributes have a one-to-one mapping with a specific Microsoft Graph resource type. For example, the Graph Planner Task entities maps to the [Microsoft Graph Planner Task resource type](/graph/api/resources/plannertask). The virtual entity shares the same attributes as the resource type.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+## Collaboration controls virtual entities
+
+| Name | Description |
+|||
+| Graph Planner Task | The Graph Planner Task table represents a Planner task in Microsoft 365. |
+| Graph Planner Plan | The Graph Planner Plan table represents a Planner plan in Microsoft 365. |
+| Graph Event | The Graph Event table represents an event in a user calendar, or the default calendar of a Microsoft 365 group. |
+| Graph Booking Appointment | The Graph Booking Appointment table represents a customer appointment for a Booking Service, performed by a set of staff members, provIDed by a Microsoft Bookings business. |
+| Graph Drive | The Graph Drive table represents the top-level object that represents a user's OneDrive or a document library in SharePoint. |
+| Graph Drive Item | The Graph Drive Item table represents a file, folder, or other item stored in a drive. |
+
+## Graph Planner Task
+
+* Entity name: m365_graphplannertask.
+* Graph resource: [plannerTask resource type](/graph/api/resources/plannertask)
+* Sorting isn't supported.
+* Filtering isn't supported.
+* Server driven pagination is supported, with maximum page size being 400.
+
+### Attributes for Graph Planner Task
+
+| Column | Dataverse Type | Details |
+||||
+| `m365_collaborationrootid` | String | Collaboration root ID of the collaboration session record is associated with multiple collaboration sessions. This will be returned as a comma delimited string. Note that this attribute won't be returned when retrieving multiple records. |
+| `m365_activechecklistitemcount` | Int32 | Number of checklist items with value set to false, representing incomplete items. |
+| `m365_graphplannertaskId` | Guid | Unique identifier of the graph planner task. |
+| `m365_appliedcategories` | String | Number of checklist items with value set to false, representing incomplete items. |
+| `m365_appliedcategories` | String | The categories to which the task has been applied. This attribute is a JSON encoded string, for example "{ \"category1\": true, \"category6\": true, \"category9\": true }" |
+| `m365_assigneepriority` | String | Hint used to order items of this type in a list view. The format is defined as outlined in [using order hints in Planner](/graph/api/resources/planner-order-hint-format). |
+| `m365_assignments` | String | The set of assignees, the task is assigned to. This attribute is a JSON encoded string for example "{\" 7be...\": {\"assignedBy\": {\"user\": {\"displayName\", \"email\", \"ID\":\" 7be...\"}, \"group\": null, \"application\": null \"device\": null}" |
+| `m365_bucketid` | String | Bucket ID to which the task belongs. The bucket needs to be in the plan that the task is in. It's 28 characters long and case-sensitive. [Format validation](/graph/api/resources/planner-identifiers-disclaimer) is done on the service. |
+| `m365_checklistitemcount` | Int32 | Number of checklist items that are present on the task. |
+| `m365_completedby` | String | Identity of the user that completed the task. This attribute is a JSON encoded string, for example {\"user\": {\"displayName\",\"ID\":\"d55...\"}} |
+| `m365_completeddatetime` | DateTime | Read-only. Date and time at which the 'percentComplete' of the task is set to '100'. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z |
+| `m365_conversationthreadid` |String | Thread ID of the conversation on the task. This is the ID of the conversation thread object created in the group. |
+| `m365_createdby` | String | Identity of the user that created the task. This attribute is a JSON encoded string, for example {\"user\": {\"displayName\",\"ID\":\"d55...\"}} |
+| `m365_createddatetime` | DateTime | Read-only. Date and time at which the task is created. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z |
+| `m365_duedatetime` | DateTime | Date and time at which the task is due. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z |
+| `m365_hasdescription` | Boolean | Read-only. Value is true if the details object of the task has a non-empty description and false otherwise. |
+| `m365_id` | String | Read-only. ID of the task. It's 28 characters long and case-sensitive. [Format validation](/graph/api/resources/planner-identifiers-disclaimer) is done on the service.|
+| `m365_orderhint` | String | Hint used to order items of this type in a list view. The format is defined as outlined in [using order hints in Planner](/graph/api/resources/planner-order-hint-format). |
+| `m365_percentcomplete` | Int32 | Percentage of task completion. When set to 100, the task is considered completed. |
+| `m365_priority` | Int32 | Priority of the task. The valid range of values is between 0 and 10, with the increasing value being lower priority (0 has the highest priority and 10 has the lowest priority). Currently, Planner interprets values 0 and 1 as "urgent", 2, 3 and 4 as "important", 5, 6, and 7 as "medium", and 8, 9, and 10 as "low". Additionally, Planner sets the value 1 for "urgent", 3 for "important", 5 for "medium", and 9 for "low". |
+| `m365_planid` | String | Plan ID to which the task belongs. |
+| `m365_previewtype` | String | This sets the type of preview that shows up on the task. The possible values are: automatic, noPreview, checklist, description, reference. |
+| `m365_referencecount` | Int32 | Number of external references that exist on the task.|
+| `m365_startdatetime` | DateTime | Date and time at which the task starts. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z |
+| `m365_title` | String |Title of the task. Primary lookup column |
+
+## Graph Planner Plan
+
+* Entity name: m365_graphplannerplan.
+* Graph resource: [plannerPlan resource type](/graph/api/resources/plannerplan).
+* Sorting isn't supported.
+* Filtering isn't supported.
+* Server driven pagination is supported, with maximum page size being 400.
+
+### Attributes for Graph Planner Plan
+
+| Column | Dataverse Type | Details |
+||||
+| `m365_collaborationrootid` | String | Collaboration root ID of the collaboration session the record is associated with. If the record is associated with multiple collaboration sessions this will be returned as a comma delimited string. Note that this attribute won't be returned when retrieving multiple records.|
+| `m365_graphplannerplanid` |Guid |Unique identifier of the graph planner plan.|
+| `m365_createdby` | String | Identity of the user that created the task. This attribute is a JSON encoded string, for example {\"user\": {\"displayName\",\"ID\":\"d55...\"}} |
+| `m365_createddatetime` | DateTime | Read-only. Date and time at which the task is created. The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z |
+| `m365_id` | String | Read-only. ID of the plan. It's 28 characters long and case-sensitive. [Format validation](/graph/api/resources/planner-identifiers-disclaimer) is done on the service.|
+| `m365_owner` | String | ID of the [group](/graph/api/resources/group) that owns the plan. After it's set, this property canΓÇÖt be updated.|
+| `m365_title` | String | Title of the plan. Primary lookup column |
+
+## Graph Event
+
+* Entity name: m365_graphevent
+* Graph resource: [event resource type](/graph/api/resources/event)
+* Sorting is supported on the following columns:
+ * m365_lastmodifieddatetime
+ * m365_createddatetime
+ * m365_hasattachments
+ * m365_importance
+ * m365_responserequested
+ * m365_sensitivity
+ * m365_showas
+ * m365_subject
+* Filtering is supported on the following columns:
+ * m365_allownewtimeproposals
+ * m365_lastmodifieddatetime
+ * m365_createddatetime
+ * m365_icaluID
+ * m365_importance
+ * m365_isallday
+ * m365_iscancelled
+ * m365_isdraft
+ * m365_responserequested
+ * m365_sensitivity
+ * m365_showas
+ * m365_subject
+ * m365_type
+* Server driven pagination is supported.
+
+### Attributes for Graph Event
+
+| Column |Dataverse Type |Details |
+||||
+|`m365_collaborationrootid` |String |Collaboration root of the collaboration session the record is associated with. If the record is associated with multiple collaboration sessions this will be returned as a comma delimited string. Note that this attribute won't be returned when retrieving multiple records. |
+|`m365_allownewtimeproposals` |Boolean |True, if the meeting organizer allows invitees to propose a new time when responding. Otherwise false, which is optional. Default is true. |
+|`m365_attendees` |String |The collection of attendees for the event. This attribute is a JSON encoded string, 15000 max in length. For example, [{{\"type\":\"required\",\"status\":{{\"response\":\"none\",\"time\":\"0001-01-01T00:00:00Z\"}},\"emailAddress\":\"test@contoso.com\"}}] |
+|`m365_body` |String |The body of the message associated with the event. It can be in HTML or text format. This attribute is a JSON encoded string, 15000 max in length. For example {\"contentType\":\"html\",\"content\":\"html/html\"} |
+|`m365_bodypreview` |String |The preview of the message associated with the event. It is in text format. |
+|`m365_categories` |String |The categories associated with the event. Each category corresponds to the displayName property of an outlookCategory defined for the user. For example [\"string\"] |
+|`m365_changekey` |String |Identifies the version of the event object. Every time the event is changed, ChangeKey changes as well. This allows Exchange to apply changes to the correct version of the object. |
+|`m365_createddatetime` |DateTime |The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z |
+|`m365_start` |DateTime |The start date, time, and time zone of the event. This attribute is a JSON encoded string, 100 max in length. For example {\"dateTime\":\"2022-01-19T11:00:00+00:00\",\"timeZone\":\"UTC\"}|
+|`m365_end` |DateTime |The date, time, and time zone that the event ends. This attribute is a JSON encoded string, 100 max in length. For example {\"dateTime\":\"2022-01-19T11:00:00+00:00\",\"timeZone\":\"UTC\"} |
+|`m365_hasattachments` |Boolean |Set to true if the event has attachments. |
+|`m365_hideattendees` |Boolean |When set to true, each attendee only sees themselves in the meeting request and meeting Tracking list. Default is false. |
+|`m365_icaluid` |String |A unique identifier for an event across calendars. This ID is different for each occurrence in a recurring series. Read-only. |
+|`m365_isallday`|Boolean |Set to true if the event lasts all day. If true, regardless of whether it's a single-day or multi-day event, start and end time must be set to midnight and be in the same time zone. |
+|`m365_iscancelled` |Boolean |Set to true if the event has been canceled. |
+|`m365_id`| String |Read-only. ID of the event. |
+|`m365_isdraft` |Boolean |Set to true if the user has updated the meeting in Outlook but hasn't sent the updates to attendees. Set to false if all changes have been sent, or if the event is an appointment without any attendees.|
+|`m365_isonlinemeeting`|Boolean|True if this event has online meeting information (that is, onlineMeeting points to an onlineMeetingInfo resource), false otherwise. Default is false (onlineMeeting is null). Optional. After you set isOnlineMeeting to true, Microsoft Graph initializes onlineMeeting. Later Outlook ignores any further changes to isOnlineMeeting, and the meeting remains available online.|
+|`m365_isorganizer`|Boolean|Set to true if the calendar owner (specified by the owner property of the calendar) is the organizer of the event (specified by the organizer property of the event). This also applies if a delegate organized the event on behalf of the owner.|
+|`m365_isremindero`n|Boolean|Set to true if an alert is set to remind the user of the event.|
+|`m365_lastmodifieddatetime`|DateTime|The Timestamp type represents date and time information using ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z|
+|`m365_location`|String|The location of the event. JSON encoded string, max 4000 in length. For example[{\"address\":null,\"coordinates\":null,\"displayName\":\"Harry\'s Bar\",\"locationEmailAddress\":null,\"locationType\":\"default\",\"locationUri\":null,\"uniqueId\":\"Harry\'s Bar\",\"uniqueIdType\":\"private\"}|
+|`m365_locations`|String|The locations where the event is held or attended from. The location and locations properties always correspond with each other. If you update the location property, any prior locations in the locations collection would be removed and replaced by the new location value. JSON encoded string, max 4000 in length.for example[{\"address\":null,\"coordinates\":null,\"displayName\":\"Harry\'s Bar\",\"locationEmailAddress\":null,\"locationType\":\"default\",\"locationUri\":null,\"uniqueId\":\"Harry\'s Bar\",\"uniqueIdType\":\"private\"}]|
+|`m365_onlinemeeting`|String|Details for an attendee to join the meeting online. Default is null. Read-only.After you set the isOnlineMeeting and onlineMeetingProvider properties to enable a meeting online, Microsoft Graph initializes onlineMeeting. When set, the meeting remains available online, and you can't change the isOnlineMeeting, onlineMeetingProvider, and onlneMeeting properties again. JSON encoded string, max 4000 in length.for example{\"conferenceId\": \"String\",\"joinUrl\": \"String\",\"phones\": [{\"@odata.type\": \"microsoft.graph.phone\"}],\"quickDial\": \"String\",\"tollFreeNumbers\": [\"String\"],\"tollNumber\": \"String\"}|
+|`m365_onlinemeetingprovider`|String|Details for an attendee to join the meeting online. Default is null. Read-only. After you set the isOnlineMeeting and `onlineMeetingProvider` properties to enable a meeting online, Microsoft Graph initializes onlineMeeting. When set, the meeting remains available online, and you can't change the isOnlineMeeting, `onlineMeetingProvider`, and onlneMeeting properties again.|
+|`m365_onlinemeetingurl`|String|A URL for an online meeting. The property is set only when an organizer specifies in Outlook that an event is an online meeting such as Skype. Read-only. To access the URL to join an online meeting, use `joinUrl`, which is exposed via the `onlineMeeting` property of the event. The `onlineMeetingUrl` property will be deprecated in the future.|
+|`m365_organizer`|String|The organizer of the event.JSON encoded string, max 4000 in length. {\"emailAddress\":{\"@odata.type\":\"microsoft.graph.emailAddress\"}}|
+|`m365_originalendtimezone`|String|The end time zone that was set when the event was created. A value of tzone://Microsoft/Custom indicates that a legacy custom time zone was set in desktop Outlook.|
+|`m365_originalstart`|DateTime|Represents the start time of an event when it's initially created as an occurrence or exception in a recurring series. This property isn't returned for events that are single instances. Its date and time information is expressed in ISO 8601 format and is always in UTC. For example, midnight UTC on Jan 1, 2014 is 2014-01-01T00:00:00Z|
+|`m365_originalstarttimezone`|String|The start time zone that was set when the event was created. A value of tzone://Microsoft/Custom indicates that a legacy custom time zone was set in desktop Outlook.|
+|`m365_recurrence`|String|The recurrence pattern for the event. JSON encoded string, max 4000 in length.for example{\"pattern\":{\"dayOfMonth\":0,\"daysOfWeek\":[\"monday\",\"wednesday\",\"friday\"],\"firstDayOfWeek\":\"sunday\",\"index\":\"first\",\"interval\":1,\"month\":0,\"type\":\"weekly\"},\"range\":{\"startDate\":\"2017-08-14\",\"endDate\":\"2018-08-14\",\"numberOfOccurrences\":0,\"recurrenceTimeZone\":\"Eastern Standard Time\",\"type\":\"endDate\"}}|
+|`m365_reminderminutesbeforestart`|Int32|The number of minutes before the event start time that the reminder alert occurs.|
+|`m365_responserequested`|Boolean|Default is true, which represents the organizer would like an invitee to send a response to the event.|
+|`m365_responsestatus`|String|Indicates the type of response sent in response to an event message. JSON encoded string, max 4000 in length.{\"response\": \"String\",\"time\": \"String (timestamp)\"}|
+|`m365_sensitivity`|String|Possible values are: normal, personal, private, confidential.|
+|`m365_seriesmasterid`|String|The ID for the recurring series master item, if this event is part of a recurring series.|
+|`m365_showas`|String|The status to show. Possible values are: free, tentative, busy, oof, workingElsewhere, unknown.|
+|`m365_subject`|String|The text of the event's subject line. Primary lookup column|
+|`m365_transactionid`|String|A custom identifier specified by a client app for the server to avoid redundant POST operations if client retries to create the same event. This is useful when low network connectivity causes the client to time out before receiving a response from the server for the client's prior create-event request. After you set `transactionId` when creating an event, you can't change transactionId in a subsequent update. This property is only returned in a response payload if an app has set it. Optional.|
+|`m365_type`|String|The event type. Possible values are: singleInstance, occurrence, exception, seriesMaster. Read-only|
+|`m365_weblink`|String|The URL to open the event in Outlook on the web. Outlook on the web opens the event in the browser if you're signed in to your mailbox. Otherwise, Outlook on the web prompts you to sign in. This URL can't be accessed from within an iFrame.|
+|`m365_grapheventid`|Guid|Unique identifier of the graph event.|
+|`m365_groupid`|String|Group ID to which the event belongs.|
+
+## Graph Booking Appointment
+
+* Entity name: m365_graphbookingappointment
+* Graph resource: [bookingAppointment resource type](/graph/api/resources/bookingappointment)
+* Sorting isn't supported.
+* Filtering is supported on the following columns:
+ * m365_bookingbusinessID
+ * m365_collaborationrootID
+ * m365_customertimezone
+ * m365_optoutofcustomeremail
+ * m365_price
+ * m365_pricetype
+ * m365_serviceID
+ * m365_servicename
+* Pagination isn't supported.
+
+### Attributes for Graph Booking Appointment
+
+| Column | Dataverse Type | Details |
+||||
+| `m365_collaborationrootid`| String| Collaboration root ID of the collaboration session the record is associated with. If the record is associated with multiple collaboration sessions this will be returned as a comma delimited string. Note that this attribute won't be returned when retrieving multiple records.|
+| `m365_graphbookingappointmentid` | Guid | Unique Identifier of the graph booking appointment.|
+| `m365_bookingbusinessid` | String | The unique Identifier of the booking business the appointment is scheduled under.|
+| `m365_additionalinformation` | String | Extra information that is sent to the customer when an appointment is confirmed.|
+| `m365_customers` | String| It lists down the customer properties for an appointment. appointment will contain a list of customer information and each unit will indicate the properties of a customer who is part of that appointment. Optional[{\"customerID\":\"d243c77b-f1ff-4615-a01f-1660b5cb0e79\",\"customQuestionAnswers\":[],\"emailAddress\":\"jordanm@contoso.com\",\"location\":{\"address\":{\"city\":\"\",\"countryOrRegion\":\"\",\"postalCode\":\"\",\"postOfficeBox\",\"state\":\"\",\"street\":\"\",\"type\" },\"coordinates\":{\"accuracy\",\"altitude\",\"altitudeAccuracy\",\"latitude\",\"longitude\" },\"displayName\":\"\",\"locationEmailAddress\",\"locationType\",\"locationUri\":\"\",\"uniqueID\",\"uniqueIDType\" },\"name\":\"Jordan Miller\",\"notes\",\"phone\",\"timeZone\",\"@odata.type\":\"#microsoft.graph.bookingCustomerInformation\"}] |
+| `m365_customertimezone` | String | The time zone of the customer. For a list of possible values, see [dateTimeTimeZone resource type](/graph/api/resources/datetimetimezone). |
+| `m365_duration` | String | The length of the appointment, denoted in ISO8601 format.|
+| `m365_enddatetime` | DateTime | The date, time, and time zone that the appointment ends.|
+| `m365_filledattendeescount` | Int32 | The current number of customers in the appointment.|
+| `m365_id` | String | The ID of the bookingAppointment. Read-only.|
+| `m365_islocationonline` | Boolean | True indicates that the appointment will be held online. Default value is false.|
+| `m365_joinweburl` | String | The URL of the online meeting for the appointment.|
+| `m365_maximumattendeescount` | Int32 | The maximum number of customers allowed in an appointment.|
+| `m365_optoutofcustomeremail` | Boolean | True indicates that the bookingCustomer for this appointment doesn't wish to receive a confirmation for this appointment.|
+| `m365_postbuffer` | String | The amount of time to reserve after the appointment ends, for cleaning up, as an example. The value is expressed in ISO8601 format.|
+| `m365_prebuffer` | String | The amount of time to reserve before the appointment begins, for preparation, as an example. The value is expressed in ISO8601 format.|
+| `m365_price` | DecimalType | The regular price for an appointment for the specified bookingService.|
+| `m365_pricetype` | String | A setting to provide flexibility for the pricing structure of services. Possible values are: undefined, fixedPrice, startingAt, hourly, free, priceVaries, callUs, notSet.|
+| `m365_reminders` | String | The collection of customer reminders sent for this appointment. The value of this property is available only when reading this bookingAppointment by it's ID. [{\"message\":\"We look forward to seeing you!\",\"offset\":\"P1D\",\"recipients\":\"customer\"},{\"message\":\"Reminder that you have an appointment!\",\"offset\":\"P1D\",\"recipients\":\"staff\"}] |
+| `m365_selfserviceappointmentid` | String | Another tracking ID for the appointment, if the appointment has been created directly by the customer on the scheduling page, as opposed to by a staff member on the behalf of the customer.|
+| `m365_serviceid` | String | The ID of the bookingService associated with this appointment.|
+| `m365_servicelocation` | String | The location where the service is delivered. {\"address\":{\"city\":\"\",\"countryOrRegion\":\"\",\"postalCode\":\"\",\"postOfficeBox\",\"state\":\"\",\"street\":\"\",\"type\" },\"coordinates\":{\"accuracy\",\"altitude\",\"altitudeAccuracy\",\"latitude\",\"longitude\" },\"displayName\":\"Our office address\",\"locationEmailAddress\",\"locationType\",\"locationUri\":\"\",\"uniqueID\",\"uniqueIDType\" } |
+| `m365_servicename` | String | The name of the bookingService associated with this appointment. This property is optional when creating a new appointment. If not specified, it's computed from the service associated with the appointment by the serviceID property. |
+| `m365_servicenotes` |String | Notes from a bookingStaffMember. The value of this property is available only when reading this bookingAppointment by its ID.|
+| `m365_smsnotificationsenabled` | Boolean | True indicates SMS notifications will be sent to the customers for the appointment. Default value is false.|
+| `m365_staffmemberids` | String | The ID of each bookingStaffMember who is scheduled in this appointment. Stored as a comma separated string.[\ΓÇ¥string\ΓÇ¥] |
+| `m365_startdatetime` | DateTime | The date, time, and time zone that the appointment begins.|
+
+## Graph Drive
+
+* Entity name: m365_graphdrive
+* Graph resource: [drive resource type](/graph/api/resources/drive)
+* Sorting isn't supported.
+* Filtering isn't supported.
+* Server driven pagination is supported.
+
+### Attributes for Graph Drive
+
+|Column |Dataverse Type |Details |
+||||
+|`m365_collaborationrootid` |String | Collaboration root ID of the collaboration session the record is associated with. If the record is associated with multiple collaboration sessions this will be returned as a comma delimited string. Note that this attribute won't be returned when retrieving multiple records. |
+|`m365_createdby` |String |Identity of the user, device, or application that created the item. Read-only. This attribute is a JSON encoded string for example { "user": { "displayName": "System Account" } } |
+|`m365_createddatetime` |DateTime |Date and time of item creation. Read-only. |
+|`m365_description` |String |Provide a user-visible description of the drive. Read-only. |
+|`m365_drivetype` |String |Describes the type of drive represented by this resource. OneDrive personal drives will return personal. OneDrive for Business will return business. SharePoint document libraries will return documentLibrary. Read-only. |
+|`m365_graphdriveid` |Guid |Unique Identifier of the graph drive. |
+|`m365_id` |String |The unique Identifier of the drive. Read-only. |
+|`m365_lastmodifiedby` | String |Identity of the user, device, and application, which last modified the item. Read-only. This attribute is a JSON encoded string for example { "user": { "email": ΓÇ£user@contoso.comΓÇ¥, "ID": "61de164e-21ff-4b1c-8cbd-77ac440894f8", "displayName": "User Name" } } |
+|`m365_lastmodifieddatetime` |DateTime |Date and time the item was last modified. Read-only.|
+|`m365_name` |String |The name of the item. Read-only. |
+|`m365_owner` |String |Optional. The user account that owns the drive. Read-only. This attribute is a JSON encoded string. For example { "group": { "ID": "76c7286f-8645-4ba8-bc0f-c65a16424aaa", "displayName": "Group Name" }} |
+|`m365_quota` |String |Optional. Information about the drive's storage space quota. Read-only. This attribute is a JSON encoded string. For example { "deleted": 482586, "remaining": 27487788645969, "state": "normal", "total": 27487790694400, "used": 1565845 } |
+|`m365_sharepointids` |String |Returns Identifiers useful for SharePoint REST compatibility. Read-only. This property isn't returned by default and must be selected using the $select query parameter. This attribute is a JSON encoded string. For example "sharePointIDs": { "listID": "29d8457a-8e26-4291-9901-09718a388aaa", "siteID": "93618739-b3ca-4107-a77c-fba278c48aaa", "siteUrl": ΓÇ£<https://contoso.sharepoint.com>ΓÇ¥, "tenantID": "53986071-de92-43ad-a41f-f3c4adb2beef", "webID": "a0d0e9ec-e547-4338-92d9-4c2c62e5beef" } |
+| `m365_siteid` |String |The Identifier for the site that contains the document library.
+|`m365_system` |String |If present, indicates that this is a system-managed drive. Read-only.
+|`m365_weburl` |String |URL that displays the resource in the browser. Read-only.
+
+### Graph Drive Item
+
+* Entity name: m365_graphdriveitem
+* Graph resource: [driveItem resource type](/graph/api/resources/driveitem)
+* Sorting is supported on the following column:
+ * m365_name
+* Filtering is supported on the following column:
+ * m365_name
+* Server driven pagination is supported.
+
+### Attributes for Graph Drive Item
+
+|Column |Dataverse Type |Details |
+||||
+|`m365_audio` |String |Audio metadata, if the item is an audio file. Read-only. Only on OneDrive Personal. This attribute is a JSON encoded string. { "album": "string", "albumArtist": "string", artist": "string", bitrate": 128, "composers": "string", copyright": "string", "disc": 0, "discCount": 0, "duration": 567, "genre": "string", "hasDrm": false, "isVariableBitrate": false, "title": "string", "track": 1, "trackCount": 16, "year": 2014 }|
+|`M365_bundle` |String |Bundle metadata, if the item is a bundle. Read-only. This attribute is a JSON encoded string. For example, { "childCount": 3, "album": { "@odata.type": "microsoft.graph.album" }, } |
+|`m365_collaborationrootid` |String |Collaboration root ID of the collaboration session the record is associated with. If the record is associated with multiple collaboration sessions this will be returned as a comma delimited string. Note that this attribute won't be returned when retrieving multiple records. |
+|`m365_copy` |String |If present in the request then a copy operation is performed. |
+|`m365_createdby` |String |Identity of the user, device, and application, which created the item. Read-only. This attribute is a JSON encoded string. For example, {"user":{"displayName":"User Name","email":"alias@contoso.com","ID":"a298b975-3493-4d9e-b2d4-3cad78f00000"},"group": null,"application","device" } |
+|`m365_createddatetime` |DateTime |Date and time of item creation. Read-only. |
+|`m365_ctag` |String |An eTag for the content of the item. This eTag isn't changed if only the metadata is changed. Note. This property isn't returned if the item is a folder. Read-only. |
+|`m365_deleted` |String |Information about the deleted state of the item. Read-only. This attribute is a JSON encoded string. For example, { "state": "string" } |
+|`m365_description` |String |Provides a user-visible description of the item. Read-write. Only on OneDrive Personal. |
+|`m365_driveid` |String |The Identifier for the drive that contains the drive item.|
+|`m365_etag` |String |eTag for the entire item (metadata + content). Read-only. |
+| `m365_file` |String |File metadata, if the item is a file. Read-only. This attribute is a JSON encoded string. For example, {"hashes":{"crc32Hash","quickXorHash":"Biuzvwdu+Tmu6yRefayD27hD9vD=","sha1Hash","sha256Hash" },"mimeType":"application/vnd.openxmlformats-officedocument.wordprocessingml.document","processingMetadata" } |
+| `m365_filesysteminfo` |String |File system information on client. This attribute is a JSON encoded string. For example, {"createdDateTime":"2022-07-21T15:02:47+00:00","lastAccessedDateTime","lastModifiedDateTime":"2022-07-21T15:02:55+00:00"} |
+|`m365_folder` |String | Folder metadata, if the item is a folder. Read-only. This attribute is a JSON encoded string. For example, {"childCount":0,"view" } |
+|`m365_graphdriveitemid` |Guid |Unique Identifier of the graph drive item. |
+|`m365_id` |String |The unique Identifier of the item within the Drive. Read-only. |
+|`m365_image` |String |Image metadata, if the item is an image. Read-only. This attribute is a JSON encoded string. For example, {"height","width" } |
+|`m365_lastmodifiedby` |String |Identity of the user, device, and application, which last modified the item. Read-only. This attribute is a JSON encoded string. For example, {"user":{"displayName":"User Name","email":"alias@contoso.com","ID":"a298b975-3493-4d9e-b2d4-3cad78f9a00e"},"group","application","device" } |
+|`m365_lastmodifieddatetime` |DateTime |Date and time the item was last modified. Read-only. |
+|`m365_location` |String |Location metadata, if the item has location data. Read-only. This attribute is a JSON encoded string. For example, "location": { "altitude": 1.0, "latitude": 1.0, "longitude": 1.0 } |
+|`m365_malware` |String |Malware metadata, if the item was detected to contain malware. Read-only. This attribute is a JSON encoded string. For example, { "description": "string" } |
+|`m365_name` |String |The name of the item (filename and extension). Read-write. |
+|`m365_package` |String |If present, indicates that this item is a package instead of a folder or file. Packages are treated like files in some contexts and folders in others. Read-only. This attribute is a JSON encoded string. For example, { "type": "oneNote" } |
+|`m365_parentreference` |String |Parent information, if the item has a parent. This attribute is a JSON encoded string. For example, {"driveID":"b!qgK-8nOzX0qISvfGCiC2Smbv0m0RlNhDvNQDZsCMpbSnchFAhWAaQoiTLZcSo1gq","driveType":"documentLibrary","ID":"01EYDCV4YHV77FE3EDDFHIVD6WJ2ETT3PP","name","path":"/drives/b!qgK-8nOzX0qISvfGCiC2Smbv0m0RlNhDvNQDZsCMpbSnchFAhWAaQoiTLZcSo1no/root: /folder name","shareID","sharepointIDs":{"listID":"401172a8-6085-421a-8893-2d9712a35c3c","listItemID","listItemUniqueID":"52feaf12-836c-4e19-8a8f-d64e8939ee52","siteID":"f34e02aa-b373-4a5f-884a-f7c60a20b64a","siteUrl":"https://contoso.sharepoint.com/sites/Contoso","tenantID","webID":"6dd2ef66-9411-43d8-bcd4-0366c08ccabd"},"siteID" } |
+|`m365_parentreferenceid` |String |The Identifier for the drive item that is the parent of the drive item. |
+|`m365_pendingoperations` |String |If present, indicates that one or more operations that might affect the state of the driveItem are pending completion. Read-only. This attribute is a JSON encoded string. For example, { "pendingContentUpdate": {"@odata.type": "microsoft.graph.pendingContentUpdate"} } |
+|`m365_photo` |String |Photo metadata, if the item is a photo. Read-only. This attribute is a JSON encoded string. For example, { "cameraMake": "Camera Make", "cameraModel": "Camera Model", "exposureDenominator": 1000000, "exposureNumerator": 41671, "focalLength": 4.38, "fNumber": 1.73, "iso": 70, "orientation": 6, "takenDateTime": "2020-04-29T14:17:39Z" } |
+|`m365_publication` |String |Provides information about the published or checked-out state of an item, in locations that support such actions. This property isn't returned by default. Read-only. This attribute is a JSON encoded string. For example, {"level":"published","versionID":"2.0"} |
+|`m365_remoteitem` |String |Remote item data, if the item is shared from a drive other than the one being accessed. Read-only. This attribute is a JSON encoded string. For example, { "ID": "string", "createdBy": { "@odata.type": "microsoft.graph.IdentitySet" }, "createdDateTime": "timestamp", "file": { "@odata.type": "microsoft.graph.file" }, "fileSystemInfo": { "@odata.type": "microsoft.graph.fileSystemInfo" }, "folder": { "@odata.type": "microsoft.graph.folder" }, "image": { "@odata.type": "microsoft.graph.image" }, "lastModifiedBy": { "@odata.type": "microsoft.graph.IdentitySet" }, "lastModifiedDateTime": "timestamp", "name": "string", "package": { "@odata.type": "microsoft.graph.package" }, "parentReference": { "@odata.type": "microsoft.graph.itemReference" }, "shared": { "@odata.type": "microsoft.graph.shared" }, "sharepointIDs": { "@odata.type": "microsoft.graph.sharepointIDs" }, "specialFolder": { "@odata.type": "microsoft.graph.specialFolder" }, "size": 1024, "video": { "@odata.type": "microsoft.graph.video" }, "webDavUrl": "url", "webUrl": "url" } |
+|`m365_root` |String |If this property is non-null, it indicates that the driveItem is the top-most driveItem in the drive. |
+|`m365_searchresult` |String |Search metadata, if the item is from a search result. Read-only. This attribute is a JSON encoded string. For example, { "onClickTelemetryUrl": "url" } |
+|`m365_shared` |String |Indicates that the item has been shared with others and provides information about the shared state of the item. Read-only. This attribute is a JSON encoded string. For example, { "scope": "users", "owner": { "user": { "displayName": "User Name", "ID": "bbbb6fa48aaaaaaa" } } } |
+|`m365_sharepointids` |String |Returns Identifiers useful for SharePoint REST compatibility. Read-only. This attribute is a JSON encoded string. e.g{"listID":"401172a7-6085-421a-8893-2d9712a35aba","listItemID":"338","listItemUniqueID":"0edc89e5-24ea-4c6b-a019-dc51f45eeccc","siteID":"f2be02aa-b373-4a5f-884a-f7c60a20bddd","siteUrl":"https://contoso.sharepoint.com/sites/Contoso","tenantID":"1c137272-0581-487f-b195-aeeb93cc4ccc","webID":"6dd2ef66-9411-43d8-bcd4-0366c08caaaa"} |
+|`m365_siteid` |String |The Identifier for the site that contains the document library. |
+|`m365_size` |IntType |Size of the item in bytes. Read-only. |
+|`m365_specialfolder` |String |If the current item is also available as a special folder, this facet is returned. Read-only. This attribute is a JSON encoded string. For example, { "name": "documents" } |
+|`m365_thumbnail` |String |If present in the request then the drive item thumbnails will be retrieved. |
+|`m365_video` |String |If the current item is also available as a special folder, this facet is returned. Read-only. This attribute is a JSON encoded string. For example, {"bitrate": 10646968, "duration": 1050683, "height": 720, "width": 1280, "audioBitsPerSample": 16, "audioChannels": 1, "audioFormat": "PCM", "audioSamplesPerSecond": 32000, "fourCC": "H264", "frameRate": 60} |
+|`m365_webdavurl` |String | WebDAV compatible URL for the item. |
+|`m365_weburl` |String |URL that displays the resource in the browser. Read-only. |
platform Virtual Tables Api https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-tables-api.md
+
+ Title: Virtual tables Web API
+
+description: In this module, learn about Virtual Tables web API for Collaboration control app, virtual table sorting, and filtering in Microsoft Teams.
+ms.localizationpriority: medium
++++
+# Virtual tables Web API
+
+When using the Dataverse Web API to retrieve multiple records from a virtual table additional query parameters can be included to support sorting, filtering, and pagination. These features aren't supported uniformly across the Collaboration controls virtual tables because they rely on the support provided by the Microsoft Graph API. See the Virtual Tables Entity Reference for details on what each virtual table supports.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+## Virtual table sorting
+
+With the virtual tables, you can use the OData $orderby query parameter to set criteria for how the result set should be sorted. Use the asc or desc suffix to specify ascending or descending order respectively. The default is ascending if the suffix isn't applied.
+
+**Supported Tables**: Each virtual table supports the same sorting functionality as itΓÇÖs respective Graph resource. The virtual tables, which support sorting are:ΓÇ»
+
+* Graph Drive Item
+* Graph Event
+
+> [!NOTE]
+> Sorting is not supported on all the attributes of the respective Graph resources. If a user tries to sort on a virtual table with an unsupported attribute, this result set will have its default order. This is the same behaviour as the Dataverse Web API on columns that do not support sorting.
+
+Examples:
+
+* GET [Organization URI]/api/data/v9.2/m365_graphdriveitems?$filter=m365_collaborationrootid eq ΓÇÿ00000000-0000-0000-0000-000000000000ΓÇÖ&$orderby=m365_name desc
+* GET [Organization URI]/api/data/v9.2/m365_graphevents?$filter=m365_groupid eq ΓÇÿ00000000-0000-0000-0000-000000000000ΓÇÖ$orderby=m365_subject asc
+
+## Virtual table filtering
+
+With the virtual tables, you can use the OData $filter query parameter to set criteria for which rows will be returned. The virtual tables are queried using the same OData operators that are supported by the Dataverse Web API.
+
+* **Comparison operators**
+
+ |Operator|Description|Example|
+ |-|-|-|
+ |eq|Equal|$filter=m365_name eq ΓÇÿContosoΓÇÖ|
+ |ne|Not Equal|$filter=m365_name ne ΓÇÿContosoΓÇÖ|
+ |gt|Greater Than|$filter=m365_price gt 50.0|
+ |ge|Greater Than or Equal|$filter=m365_price ge 50.0|
+ |lt|Less Than|$filter=m365_price lt 50.0|
+ |le|Less Than or Equal|$filter=m365_price le 50.0|
+
+* **Logical operators**
+
+ |Operator|Description|Example|
+ |-|-|-|
+ |and|Logical and |$filter=m365_name eq ΓÇÿContosoΓÇÖ and m365_price eq 50.0|
+ |or|Logical or |$filter=m365_name ne ΓÇÿContosoΓÇÖ or m365_price eq 50.0|
+ |not|Logical negotiation |$filter=not contains(m365_name,ΓÇÖContosoΓÇÖ)|
+
+* **Grouping operators**
+
+ |Operator|Description|Example|
+ |-|-|-|
+ |( )|Precedence grouping |$filter=(m365_name eq ΓÇÿContosoΓÇÖ and m365_price eq 50.0) or contains(m365_subject,ΓÇÖTeam SyncΓÇÖ)|
+
+* **Query Functions**
+
+ |Function |Example |
+ |-|-|
+ |contains|$filter=contains(m365_name,ΓÇÖContosoΓÇÖ)|
+ |endswith|$filter=endswith(m365_name,ΓÇÖContosoΓÇÖ)|
+ |startswith|$filter=startswith(m365_name,ΓÇÖContosoΓÇÖ)|
+
+**Supported Tables**: Each virtual table supports the same filtering functionality as itΓÇÖs respective Graph resource. The virtual tables, which support filtering are:
+
+* Graph Booking Appointment
+* Graph Drive Item
+* Graph Event
+
+> [!Note]
+> Filtering is not supported on all the attributes of the respective Graph resources. If a user tries to filter on a virtual table with an unsupported attribute, this filter will be ignored. This is the same behaviour as the Dataverse Web API on columns that do not support filtering.
+
+Examples:
+
+* GET [Organization URI]/api/data/v9.2/m365_graphbookingappointments?$filter=m365_bookingbusinessid eq ΓÇÿContosoBank@Contoso.onmicrosoft.comΓÇÖ and m365_price eq 100.0
+* GET [Organization URI]/api/data/v9.2/m365_graphdriveitems?$filter=m365_collaborationrootid eq ΓÇÿ00000000-0000-0000-0000-000000000000ΓÇÖ and m365_name eq ΓÇÿMeeting Notes.docxΓÇÖ
+* GET [Organization URI]/api/data/v9.2/m365_graphevents?$filter=m365_groupid eq ΓÇÿ00000000-0000-0000-0000-000000000000ΓÇÖ and m365_subject eq ΓÇÿMonthly SyncΓÇÖ
+
+## Virtual table pagination
+
+Pagination is a useful resource for fetching a large set of records. Virtual Table pagination can be achieved in three different ways.
+
+You can specify the page size by using the `odata.maxpagesize` preference value in the request header. If the result set spans multiple pages, the response will include the `@odata.nextLink` property. Sample request and response are as following:
+
+# [Request](#tab/request)
+
+```http
+ GET [Organization URI]/api/data/v9.2/m365_graphdriveitems
+ Accept: application/json
+ Prefer: odata.maxpagesize=2
+```
+
+# [Response](#tab/response)
+
+```json
+{
+
+ "@odata.context": "[Organization URI]/api/data/v9.0/$metadata#m365_graphdriveitems",
+ "value": [
+ {
+ "@odata.etag": "W/\"{FA93AF7C-1F45-4714-85A5-BB95EB86E1E5}\"",
+ "m365_name": "Review.doc",
+ "m365_graphdriveitemid": "f50aae23-6644-3d35-66d7-e3c5a979dad3",
+ …
+ },
+ {
+ "@odata.etag": "W/\"{3938D549-1AEF-46A5-BF3C-38472AD934C2}\"",
+ "m365_name": "Review.doc",
+ "m365_graphdriveitemid": "3d59a7e2-ec83-d0b3-270e-8ad676622027",
+ …
+ }
+ ],
+ "@odata.nextLink": "[Organization URI]/api/data/v9.0/m365_graphdriveitems &$skiptoken=%3Ccookie%20pagenumber=%222%22%20pagingcookie=%22UGFnZWQ9VFJVRSZwX1NvcnRCZWhhdmlvcj0xJnBfRmlsZUxlYWZSZWY9dGVzdCZwX0lEPTI5%22%20istracking=%22False%22%20/%3E"
+}
+```
+++
+Currently the following Virtual Tables support the `odata.maxpagesize` preference:
+
+* Graph Booking Appointment
+* Graph Calendar Event
+* Graph Drive
+* Graph Drive Item
+
+You can specify the number of records to return by passing the `$top` option in the URL. If you also need to specify the page number, you can do so by passing a paging cookie as an XML-encoded string as the `$skiptoken` option. To fetch a specific page number, you can pass the paging cookie in the following format:
+
+ `<cookie pagenumber=3 />`
+
+# [Request](#tab/request1)
+
+```http
+ GET [Organization URL]/api/data/v9.2/m365_graphevents?$top=2&$skiptoken=<cookie pagenumber='3' />
+```
+
+# [Response](#tab/response1)
+
+```json
+
+{
+ "@odata.context": "[Organization URI]/api/data/v9.0/$metadata#m365_graphevents",
+ "value": [
+ {
+ "@odata.etag": "W/\"{FA93AF7C-1F45-4714-85A5-BB95EB86E1E5}\"",
+ "m365_graphdeventid": "3d59a7e2-ec83-d0b3-270e-8ad676622027",
+ "m365_subject": "Important meeting",
+ …
+ },
+ {
+ "@odata.etag": "W/\"{3938D549-1AEF-46A5-BF3C-38472AD934C2}\"",
+ "m365_graphdeventid": "f50aae23-6644-3d35-66d7-e3c5a979dad3",
+ "m365_subject": "Another important meeting",
+ …
+ }
+ ]
+}
+
+```
+++
+> [!Note]
+> The response will not include the `@nextLink` property. If your use case requires the next page link to be returned, you can use the odata.maxpagesize preference header described in section 1 instead of passing the $top URI parameter.
+
+Currently the following virtual tables support fetching a specific page:
+
+* Graph Booking Appointment
+* Graph Calendar Event
+
+You can pass a fetch XML as an XML-encoded string. With the fetch XML option, you can specify several query preferences. The pagination specific options are page (page number) and count (page size). The following XML specifies the page number and size:
+
+ `<fetch version="1.0" mapping="logical" returntotalrecordcount="true" page="<Page Number>" count="<Page Size>"></fetch>`
+
+# [Request](#tab/request2)
+
+```http
+GET [Organization URL]/api/data/v9.2/m365_graphevents?$fetchXml=<fetch version="1.0" mapping="logical" returntotalrecordcount="true" page="3" count="2"></fetch>
+
+```
+
+# [Response](#tab/response2)
+
+```json
+{
+
+ "@odata.context": "[Organization URI]/api/data/v9.0/$metadata#m365_graphdevents",
+ "@Microsoft.Dynamics.CRM.fetchxmlpagingcookie": "<cookie pagenumber=\"3\" pagingcookie=\"\" istracking=\"False\" />",
+ "value": [
+ {
+ "@odata.etag": "W/\"{FA93AF7C-1F45-4714-85A5-BB95EB86E1E5}\"",
+ "m365_graphdeventid": "3d59a7e2-ec83-d0b3-270e-8ad676622027",
+ "m365_subject": "Important meeting",
+ …
+ },
+ {
+ "@odata.etag": "W/\"{3938D549-1AEF-46A5-BF3C-38472AD934C2}\"",
+ "m365_graphdeventid": "f50aae23-6644-3d35-66d7-e3c5a979dad3",
+ "m365_subject": "Another important meeting",
+ …
+ }
+ ]
+}
+
+```
+++
+The following virtual tables support the count property to be passed as part of the fetchXml option:
+
+* Graph Drive
+* Graph Drive Item
+
+The following virtual tables support the page property as part of the fetchXml option:
+
+* Graph Booking Appointment
+* Graph Calendar Event
platform Virtual Tables For Tasks https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/samples/virtual-tables-for-tasks.md
+
+ Title: Virtual tables for Tasks, Meetings, and Files in Collaboration control app
+
+description: In this module, learn about Virtual tables for Tasks, Meetings, and Files in Collaboration control app in Microsoft Teams.
+ms.localizationpriority: medium
++++
+# Virtual tables for Tasks, Meetings, Files
+
+A new capability with this release is a set of Virtual tables. These enable developers to interact with Graph via OData APIs.
+
+The Collaboration controls core solution includes a set of [virtual tables](/power-apps/developer/data-platform/virtual-entities/get-started-ve), which can be used for programmatic access to the data created by the Collaboration controls.
+
+> [!NOTE]
+> Currently Collaboration controls are available only in [public developer preview](~/resources/dev-preview/developer-preview-intro.md).
+
+> [!TIP]
+> [Virtual tables](/power-apps/developer/data-platform/virtual-entities/get-started-ve) also known as virtual entities, enable the integration of data residing in external systems by seamlessly representing that data as tables in Microsoft Dataverse, without replication of data and often without custom coding.
+
+The external system that is used by the Collaboration controls is Microsoft Graph. There are virtual tables for group calendar events, booking appointments, planner plans or tasks and SharePoint drives, folders, and files.
+
+This article provides samples, which demonstrate how to access the virtual tables using the Dataverse REST API to perform CRUD (Create, Read, Update, and Delete) operations.
+
+> [!TIP]
+> For more information on the Dataverse REST API, see [use the Microsoft Dataverse Web API](/power-apps/developer/data-platform/webapi/overview).
+
+* Virtual tables use the standard Dataverse Web API, which makes it easy to use the virtual tables to populate data in your application.
+* Virtual tables implement complex workflows required to support Collaboration controls and these execute within Microsoft data centers for optimum performance.
+* Virtual tables use the standard Dataverse logging and monitoring capabilities.
+
+After you install the Collaboration controls, the virtual tables can be treated as another service to your application that can depend on.
++
+**Pre-requisites**
+
+To follow along with this article, you'll need:
+
+1. A Dataverse environment where the Collaboration controls have been installed.
+1. A user account in the Dataverse environment, which has the **Collaboration controls User** role assigned to it.
+1. A third-party tool, for example: Post man or some custom C# code that allows you to authenticate to Microsoft Dataverse instances and to compose and send Web API requests and view responses.
+
+> [!TIP]
+> Microsoft provides information on how to configure a Postman environment that connects to your Dataverse instance and use Postman to perform operations with the Web API. See [Use Postman with Microsoft Dataverse Web API](/power-apps/developer/data-platform/webapi/use-postman-web-api).
+
+## Virtual tables sample scenario
+
+The scenario described in this guide uses the Planner Plan and Task virtual tables. The scenario described is the same one that the Tasks Collaboration control uses. From a user perspective the scenario shows how a Planner Plan, and several Tasks are created and associated with a specific business record. The scenario goes on to show how to retrieve the tasks associated with the business record and how to read, update and delete a specific planner task.
+
+The following sequence diagram explains the interaction between the client, which could be the Tasks collaboration control, the [Collaboration API](~/samples/collaboration-api-reference.md) and the Planner Plan and Task virtual tables.
++
+## Virtual tables basic operations
+
+This section describes the HTTP requests and responses for each step in the sample scenario.
+
+**Task 1: Retrieve the Group ID**
+
+Retrieve the Group ID used in [settings for your Collaboration](~/samples/app-with-collaboration-controls.md#define-settings-for-your-collaboration).
+
+> [!NOTE]
+> The user you use to create the Plan in the subsequent tasks, must be a member of this group. If not you will get 403 Forbidden response.
+
+**Task 2: Begin a Collaboration session**
+
+A collaboration session is a record in the collaboration root table, which allows you to associate multiple collaborations, for example, tasks, events, appointments with a business record.
+
+A collaboration session allows you to perform operations such as list of the calendar events associated with a business record, for example an inspections application.
+
+# [Request](#tab/request)
+
+```http
+ HTTP/1.1 POST https://[Organization URI]/api/data/v9.0/m365_begincollaborationsession
+```
+
+```json
+{
+ "applicationName": "{{applicationName}}",
+ "collaborationRootEntityId": "{{collaborationRootEntityId}}",
+ "collaborationRootEntityName": "{{entityName}}"
+}
+```
+
+* `applicationName`: Unique name for the application
+* `collaborationRootEntityName`: Name of the business record entity
+* `collaborationRootEntityId`: Primary key (ID) of the specific business record
+
+# [Response](#tab/response)
+
+```http
+ HTTP/1.1 200 OK
+```
+
+```json
+{
+ "@odata.context": "https:// [Organization URI]/api/data/v9.0/$metadata#Microsoft.Dynamics.CRM.m365_begincollaborationsessionResponse",
+ "collaborationRootId": "72fc6b52-39d5-ec11-a7b6-0022481bfe8f"
+}
+```
+++
+Keep track of the `collaborationRootId` as it will be needed in subsequent requests.
+
+**Task 3: Create a Planner Plan**
+
+Create a Planner Plan and associate it with the collaboration session created above with `Group ID` and `collaborationRootId`.
+
+# [Request](#tab/request1)
+
+```http
+ HTTP/1.1 POST https://[Organization URI]/api/data/v9.0/m365_graphplannerplans
+```
+
+```json
+
+{
+ "m365_collaborationrootid": "{{collaborationRootId}}",
+ "m365_owner": "{{groupId}}",
+ "m365_title": "{{planTitle}}"
+}
+
+```
+
+* `collaborationRootId`: Identifies the collaboration session we want to associate this plan with, use the value from task 2
+
+* `groupId`: Identifies the group who will own this plan, use the value from step 1
+
+* `planTitle`: Title for the plan
+
+# [Response](#tab/response1)
+
+```http
+ HTTP/1.1 201 Created
+```
+
+```json
+
+{
+ "@odata.context": "https:// [Organization URI]/api/data/v9.0/$metadata#m365_graphplannerplans/$entity",
+ "@odata.etag": "W/\"JzEtUGxhbiAgQEBAQEBAQEBAQEBAQEBARCc=\"",
+ "m365_createdby": "{\"user\":{\"displayName\":null,\"email\":null,\"id\":\"be330617-0e2b-48e9-8bf7-429a09c78e65\"},\"group\":null}",
+ "m365_createddatetime": "2022-05-16T16:58:33.1833561Z",
+ "m365_owner": "03614cef-8f5b-4265-9944-080d013c55d6",
+ "m365_title": "Multi-byte plan",
+ "m365_id": "8I6fu1kNS0elsbTxd67bi2UADnJu",
+ "m365_collaborationrootid": "72fc6b52-39d5-ec11-a7b6-0022481bfe8f",
+ "m365_graphplannerplanid": "5c9c3ecf-f157-0f67-dcd9-733a77ad593e",
+ "m365_details": null
+}
+
+```
+++
+Keep track of the`m365_id` as it will be needed in subsequent requests.
+
+**Task 4: Create a Planner Task**
+
+Create a Planner Task with `PlanId` and `collaborationRootId`. you can create several Planner Tasks and associate them with the collaboration session created earlier.
+
+# [Request](#tab/request2)
+
+```http
+ HTTP/1.1 POST https://[Organization URI]/api/data/v9.0/m365_graphplannertasks
+```
+
+```json
+{
+ "m365_collaborationrootid": "{{collaborationRootId}}",
+ "m365_planid": "{{planId}}",
+ "m365_title": "{{taskTitle}}",
+ "m365_duedatetime": "2022-05-04T08:00:00Z",
+ "m365_assignments": "{\"me\":{\"orderHint\":\" !\",\"@odata.type\":\"#microsoft.graph.plannerAssignment\"}}"
+}
+
+```
+
+* `collaborationRootId`: Identifies the collaboration session we want to associate this plan with, us the value from task 2
+* `planId`: Identifies the plan this task will be assigned to, use the value from the previous step
+* `taskTitle`: Title for the task
+
+# [Response](#tab/response2)
+
+```http
+ HTTP/1.1 201 Created
+```
+
+```json
+
+{
+ "@odata.context": "https://mwtmarkwallaceunmanaged.crm10.dynamics.com/api/data/v9.0/$metadata#m365_graphplannertasks/$entity",
+ "@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBARCc=\"",
+ "m365_activechecklistitemcount": 0,
+ "m365_appliedcategories": "{}",
+ "m365_assigneepriority": "8585488865579062167",
+ "m365_assignments": "{\"be330617-0e2b-48e9-8bf7-429a09c78e65\":{\"assignedBy\":{\"user\":{\"displayName\":null,\"email\":null,\"id\":\"be330617-0e2b-48e9-8bf7-429a09c78e65\"},\"group\":null},\"assignedDateTime\":\"2022-05-16T16:58:47.571364+00:00\",\"orderHint\":\"8585488866179218449P`\",\"@odata.type\":\"#microsoft.graph.plannerAssignment\"}}",
+ "m365_checklistitemcount": 0,
+ "m365_createdby": "{\"user\":{\"displayName\":null,\"email\":null,\"id\":\"be330617-0e2b-48e9-8bf7-429a09c78e65\"},\"group\":null}",
+ "m365_createddatetime": "2022-05-16T16:58:47Z",
+ "m365_duedatetime": "2022-05-04T08:00:00Z",
+ "m365_hasdescription": false,
+ "m365_orderhint": "8585488865579062167",
+ "m365_percentcomplete": 0,
+ "m365_priority": 5,
+ "m365_planid": "8I6fu1kNS0elsbTxd67bi2UADnJu",
+ "m365_previewtype": "automatic",
+ "m365_referencecount": 0,
+ "m365_title": "Team-oriented discrete time-frame",
+ "m365_id": "8WSKWaEqAU-aZV4h9VUn0GUALXbH",
+ "m365_collaborationrootid": "72fc6b52-39d5-ec11-a7b6-0022481bfe8f",
+ "m365_graphplannertaskid": "0a2115b9-8b03-90ee-b450-42005d906ce8",
+ "m365_completedby": null,
+ "m365_details": null,
+ "m365_completeddatetime": null,
+ "m365_conversationthreadid": null,
+ "m365_bucketid": null,
+ "m365_startdatetime": null
+}
+
+```
+++
+Keep track of the `m365_graphplannertaskid` as it will be needed in subsequent requests.
+
+> [!NOTE]
+> The `m365_graphplannertaskid` is the primary key of the record in the Planner Task virtual table. All subsequent requests to the virtual table to interact with this record must use this primary key. This will be referred to as the `plannerTaskId` in subsequent steps in this document.
+
+You should repeat this step to create multiple tasks in the plan.
+
+**Task 5: Retrieve Associated Planner Tasks**
+
+Retrieve Associated Planner Tasks with `collaborationRootId` associated with the collaboration session created previously.
+
+# [Request](#tab/request3)
+
+```http
+ HTTP/1.1 GET https://[Organization URI]/api/data/v9.0/ m365_graphplannertasks?$filter=m365_collaborationrootid eq '{{collaborationRootId}}'&$select=m365_graphplannertaskid,m365_title,m365_createddatetime
+```
+
+* `$filter`: Use the $filter system query to request records associated with the collaboration session (by specifying the ID of the collaboration root record).
+* `$select`: Use the $select system query option to request specific properties.
+
+# [Response](#tab/response3)
+
+```http
+ HTTP/1.1 200 OK
+```
+
+```json
+
+{
+
+ "@odata.context": "https://mwtmarkwallaceunmanaged.crm10.dynamics.com/api/data/v9.0/$metadata#m365_graphplannertasks(m365_graphplannertaskid,m365_title,m365_createddatetime)",
+ "value": [
+ {
+ "@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBARCc=\"",
+ "m365_graphplannertaskid": "8537731e-9414-1091-8d7d-ce5b74fc2477",
+ "m365_title": "Diverse executive core",
+ "m365_createddatetime": "2022-05-16T16:58:45Z",
+ "m365_id": "N_A2qmo3j0uvZZY1yd6V_GUADDEg",
+ "m365_collaborationrootid": "72fc6b52-39d5-ec11-a7b6-0022481bfe8f"
+ },
+ {
+ "@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBARCc=\"",
+ "m365_graphplannertaskid": "4a89895a-050e-9165-a6e4-19c3850f22ec",
+ "m365_title": "Cloned didactic open architecture",
+ "m365_createddatetime": "2022-05-16T16:58:41Z",
+ "m365_id": "--U0zbgsO0us084C0yCyEWUALbWw",
+ "m365_collaborationrootid": "72fc6b52-39d5-ec11-a7b6-0022481bfe8f"
+ },
+ {
+ "@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBARCc=\"",
+ "m365_graphplannertaskid": "20a08b8c-394b-b3fb-f9d1-47496df7a67b",
+ "m365_title": "Synergized zero defect interface",
+ "m365_createddatetime": "2022-05-16T16:58:43Z",
+ "m365_id": "AMn3RtbmV0m6cvkp5HKDCWUAKI0_",
+ "m365_collaborationrootid": "72fc6b52-39d5-ec11-a7b6-0022481bfe8f"
+ }
+ ]
+}
+
+```
+++
+Keep track of the `m365_idΓÇÿs` as IDs will be needed in subsequent requests.
+
+**Task 6: Retrieve a Planner Task**
+
+Retrieve a Planner Task with `PlannerTaskID` to perform a Read operation on one of the planner tasks created earlier.
+
+# [Request](#tab/request4)
+
+```http
+ HTTP/1.1 GET https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+* `plannerTaskId`: The primary key for the planner task record is the `m365_graphplannertaskid` property.
+
+# [Response](#tab/response4)
+
+```http
+ HTTP/1.1 200 OK
+```
+
+```json
+{
+ "@odata.context": "https://mwtmarkwallaceunmanaged.crm10.dynamics.com/api/data/v9.0/$metadata#m365_graphplannertasks/$entity",
+ "@odata.etag": "W/\"JzEtVGFzayAgQEBAQEBAQEBAQEBAQEBARCc=\"",
+ "m365_activechecklistitemcount": 0,
+ "m365_appliedcategories": "{}",
+ "m365_assigneepriority": "8585488204334528131",
+ "m365_assignments": "{\"be330617-0e2b-48e9-8bf7-429a09c78e65\":{\"assignedBy\":{\"user\":{\"displayName\":null,\"email\":null,\"id\":\"be330617-0e2b-48e9-8bf7-429a09c78e65\"},\"group\":null},\"assignedDateTime\":\"2022-05-17T11:20:52.0247676+00:00\",\"orderHint\":\"8585488204934840644P2\",\"@odata.type\":\"#microsoft.graph.plannerAssignment\"}}",
+ "m365_checklistitemcount": 0,
+ "m365_createdby": "{\"user\":{\"displayName\":null,\"email\":null,\"id\":\"be330617-0e2b-48e9-8bf7-429a09c78e65\"},\"group\":null}",
+ "m365_createddatetime": "2022-05-17T11:20:52Z",
+ "m365_duedatetime": "2022-05-04T08:00:00Z",
+ "m365_orderhint": "8585488204334528131",
+ "m365_percentcomplete": 0,
+ "m365_priority": 5,
+ "m365_planid": "8I6fu1kNS0elsbTxd67bi2UADnJu",
+ "m365_previewtype": "automatic",
+ "m365_referencecount": 0,
+ "m365_title": "Secured content-based customer loyalty",
+ "m365_id": "SXmz1hxiOk-E3MKJUyhj0mUABvix",
+ "m365_details": "{\"@odata.context\":\"https://graph.microsoft.com/beta/$metadata#planner/tasks('SXmz1hxiOk-E3MKJUyhj0mUABvix')/details/$entity\",\"@odata.etag\":\"W/\\\"JzEtVGFza0RldGFpbHMgQEBAQEBAQEBAQEBAQEBARCc=\\\"\",\"description\":null,\"previewType\":\"automatic\",\"id\":\"SXmz1hxiOk-E3MKJUyhj0mUABvix\",\"references\":{},\"checklist\":{}}",
+ "m365_graphplannertaskid": "1b326015-bb43-945c-85bc-9b2a4ed16c73",
+ "m365_completedby": null,
+ "m365_hasdescription": null,
+ "m365_collaborationrootid": null,
+ "m365_completeddatetime": null,
+ "m365_conversationthreadid": null,
+ "m365_bucketid": null,
+ "m365_startdatetime": null
+}
+
+```
+++
+Keep track of the `@odata.etag` property and the`m365_graphplannertaskid` property as these will be needed to perform update or delete operations.
+
+**Task 7: Update a Planner Task**
+
+Update a Planner Task with `PlannerTask ID` to perform an Update operation on one of the planner tasks created in the previous step. To update a planner task, execute the following request:
+
+# [Request](#tab/request5)
+
+```http
+ HTTP/1.1 PATCH https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+* Header: If-Match: {{@odata.etag}}
+
+```json
+
+{
+ "m365_title": "{{$planTitle}}"
+}
+
+```
+
+* `@odata.etag`: Etag for the task, you must perform a read to retrieve the most up-to-date version.
+
+* `planTitle`: Updated title for the task
+
+# [Response](#tab/response5)
+
+```http
+ HTTP/1.1 204 No Content
+```
+++
+**Task 8: Delete a Planner Task**
+
+Delete a Planner Task with `PlannerTask ID` to perform a Delete operation on one of the planner tasks created in the previous step. To delete a planner task, execute the following request:
+
+# [Request](#tab/request6)
+
+```http
+ HTTP/1.1 DELETE https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+* `@odata.etag`: Etag for the task, you must perform a read to retrieve the most up-to-date version.
+
+# [Response](#tab/response6)
+
+```http
+ HTTP/1.1 204 No Content
+```
+++
+**Task 9: Update a Planner Task details**
+
+Update a Planner Task with `PlannerTask ID` to perform an update operation on one of the planner tasks created in the previous step.
+
+# [Request](#tab/request7)
+
+```http
+ HTTP/1.1 PATCH https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+Header: If-Match: {{@odata.etag}}
+
+```json
+
+{
+
+ "m365_title": "{{$planTitle}}",
+ "m365_details": "{\"@odata.etag\":\"{{details.etag}}\",\"description\":\"Updated Task Description\"}"
+
+}
+```
+
+* `@odata.etag`: Etag for the task, you must perform a read to retrieve the most up to date version.
+* `planTitle`: Updated title for the task.
+* `@details.etag`: Etag for the task details, you must perform a read using the query $select query parameter to include the `m365_details` column to retrieve the most up to date version. This value will be included in the `m365_details` column of the response. This value isn't the same as the `@odata.etag` because in the Planner backend, the Task and its details are stored separately.
+
+# [Response](#tab/response7)
+
+```http
+HTTP/1.1 204 No Content
+```
+++
+> [!NOTE]
+> You can set the `If-Match` header to be '*' and then you'll not need to provide any etag values, but your changes will always overwrite the task and itΓÇÖs details.
+
+## Virtual tables authorization
+
+Following are the authorization steps required to make HTTP requests using the Virtual tables in the Collaboration controls solution.
+
+### Azure app registration
+
+To acquire the correct bearer token, an app registration in Azure is required. For more information on app registrations, see [register an app](/azure/active-directory/develop/quickstart-register-app).
+
+1. Create an app registration in the Azure portal to authenticate.
+1. Browse to **Certificates & secrets**.
+1. Create a new client secret.
+
+ > [!IMPORTANT]
+ > Make sure to copy the secret value and store for later use. You will not be able to access it again after leaving the current page.
+
+1. Browse to **API Permissions**.
+1. Add the **user_impersonation** delegated permission from Dynamics CRM.
+1. Grant admin consent for this permission.
+
+ :::image type="content" source="../assets/images/collaboration-control/power-automate-api-permission.png" alt-text="The screenshot is an example that shows the Power Automate API permission":::
+
+1. Browse to **Manifest**.
+1. Set the value of the following attributes to true:
+
+ * oauth2AllowIdTokenImplicitFlow
+ * oauth2AllowImplicitFlow
+
+1. Select Save.
+
+ :::image type="content" source="../assets/images/collaboration-control/power-automate-manifest.png" alt-text="The screenshot is an example that shows the Power Automate manifest":::
+
+### PowerApps environment permissions
+
+After the app registration has been set up, you must set up an application user in PowerApps environment. This will allow you to authenticate with the correct Dynamics scopes that were configured earlier.
+
+1. Open the [Power Platform Admin Center](https://admin.powerplatform.microsoft.com/).
+1. Browse to **Environments** > **Your_Environment** > **Users** > **App Users List**.
+1. Select **New App User** and select your Azure app registration.
+1. Select **Edit Security Roles** and assign the **System Administrator** role to the app user.
+
+ 1. The **System Administrator** role is applied to allow authentication for any users that have a lower security role. For example, **Collaboration controls User**.
+ 1. This can be restricted by applying a lower role to the application. For example, **Collaboration controls Administrator**.
+
+ :::image type="content" source="../assets/images/collaboration-control/power-automate-admin-center.png" alt-text="The screenshot is an example that shows the Power automate admin center":::
+
+### Getting the bearer token
+
+After completion of Azure app registration and PowerApps environment permissions, send the following HTTP request to get the Bearer token.
+
+```http
+POST https://login.microsoftonline.com/<AZURE_APP_TENANT_ID>/oauth2/token
+```
+
+* **Content-Type**: application/x-www-form-urlencoded
+* **client_id**: <AZURE_APP_CLIENT_ID>
+* **&client_secret**: <AZURE_APP_CLIENT_ID>
+* **&resource**: https://\<RESOURCEURL\>/
+* **&username**: \<USERNAME\>
+* **&password**: \<PASSWORD\>
+* **&grant_type**: Password
+
+> [!IMPORTANT]
+> Make sure to include the trailing forward slash on the resource parameter. If not you will get an error related to Graph scopes when calling the virtual table.
+
+From the response payload, copy the value of the **access_token** property. You can then pass this Bearer token as the part of the authorization header when making requests to the Virtual tables.
++
+## Virtual tables error handling
+
+Virtual tables error handling describes common error scenarios and how the virtual tables will respond.
+
+### Attempt to create a virtual record without a Collaboration session
+
+A valid collaboration session is required for every request to create a virtual record. When a virtual record is created the virtual table will create a collaboration map record, which includes the virtual record primary key, entity name and the external ID that is, Graph resource ID. This collaboration map is associated with a collaboration session, and this is how the Collaboration controls will keep track of the collaborations associated with a business record.
+
+# [Request](#tab/request8)
+
+```http
+ HTTP/1.1 POST https://[Organization URI]/api/data/v9.0/m365_graphplannertasks
+```
+
+```json
+
+{
+ "m365_planid": "{{planId}}",
+ "m365_title": "{{taskTitle}}",
+ "m365_duedatetime": "2022-05-04T08:00:00Z",
+ "m365_assignments": "{\"me\":{\"orderHint\":\" !\",\"@odata.type\":\"#microsoft.graph.plannerAssignment\"}}"
+}
+
+```
+
+The `collaborationRootId` property is missing from the request.
+
+# [Response](#tab/response8)
+
+```http
+ HTTP/1.1 400 Bad Request
+```
+
+```json
+
+{
+ "error": {
+ "code": "0x80048d0b",
+ "message": "Parameter 'm365_collaborationrootid' is null, empty, or white-space."
+ }
+}
+
+```
+++
+To resolve this issue, you must always provide a valid `collaborationRootId` property when creating a virtual record.
+
+### Attempt to read a virtual record without a Collaboration map
+
+Virtual tables allow you to execute requests, which return collections of virtual records. We saw this earlier in this document where we requested all the planner tasks associated with a specific collaboration session. It's also possible to request all the planner tasks associated with a specific planner plan by using a $filter system query like this: $filter=m365_planid eq`{{planId}}`. One issue that will happen if you use such a query is that records will be returned for planner tasks, which aren't associated with a collaboration session that is, planner tasks that were created by a means other than using a Collaboration control. If you attempt to read, update, or delete such a record the request will fail because the virtual table can't find the associated collaboration map.
+
+# [Request](#tab/request9)
+
+```http
+ HTTP/1.1 GET https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+The `plannerTaskId` property is associated with a planner task, which was created using the Planner web interface and so doesn't have a collaboration map record.
+
+# [Response](#tab/response9)
+
+```http
+ HTTP/1.1 404 Not Found
+```
+
+```json
+{
+ "error": {
+ "code": "0x80048d02",
+ "message": "A record with the specified key values does not exist in m365_collaborationmap entity"
+ }
+}
+```
+++
+To resolve this issue, you must check the error message in the response and if it's set to the message shown above this means the virtual record isn't associated. To create an association for this record, you must call [Associate Collaboration Map - REST API](/rest/api/industry/collaboration-toolkit/collaboration-custom-ap-is/associate-collaboration-map).
+
+### Attempt to read a virtual record and the Graph resource has been deleted
+
+Related to the previous error, you need to handle the case where a Graph resource has been deleted but the client still has a reference to the deleted virtual record. This can happen if another user deleted the record. If you attempt to read, update, or delete such a record the request will fail because the virtual table can't retrieve the resource from Graph.
+
+# [Request](#tab/request10)
+
+```http
+ HTTP/1.1 GET https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+The `plannerTaskId` property is associated with a planner task, which was deleted.
+
+# [Response](#tab/response10)
+
+```http
+ HTTP/1.1 404 Not Found
+```
+
+```json
+{
+ "error": {
+ "code": "0x80048d02",
+ "message": "REST call failed because: Reason - NotFound, Full error - {\"error\":{\"code\":\"\",\"message\":\"The requested item is not found.\",\"innerError\":{\"date\":\"2022-05-17T16:30:51\",\"request-id\":\"b692a31a-312d-490c-8dce-d258459a0211\",\"client-request-id\":\"b692a31a-312d-490c-8dce-d258459a0211\"}}}."
+ }
+}
+```
+++
+This case must be handled by any client code, which retrieves virtual records as another user can delete the associated Graph resource at any time.
+
+### Attempt to update a virtual record with an invalid @odata.etag
+
+The `@odata.etag` property is used for data concurrency and to prevent the over writing of the same record if it has been updated by another user. When, a record is read the current etag is returned, and remains valid until the record is changed. The etag should be included in any update request and will be checked before the operation completes. If the record was changed by another user since the current user read the record, then the current users update request will fail.
+
+If you perform two updates requests using the same @odata.etag, then the second request will fail:
+
+# [Request](#tab/request11)
+
+```http
+ HTTP/1.1 PATCH https://[Organization URI]/api/data/v9.0/m365_graphplannertasks({{plannerTaskId}})
+```
+
+Header: If-Match: {{@odata.etag}}
+
+```json
+{
+ "m365_title": "{{$planTitle}}"
+}
+
+```
+
+# [Response](#tab/response11)
+
+```http
+ HTTP/1.1 409 Conflict
+```
+
+```json
+{
+ "error": {
+ "code": "0x80048d08",
+ "message": "REST call failed because: Reason - Conflict, Full error - {\"error\":{\"code\":\"\",\"message\":\"The attempted changes conflicted with already accepted changes. Read the latest state and resolve differences.\",\"innerError\":{\"date\":\"2022-05-18T06:54:55\",\"request-id\":\"dc6cd2b7-1509-4e81-91ff-22cf35b86e18\",\"client-request-id\":\"dc6cd2b7-1509-4e81-91ff-22cf35b86e18\"}}}."
+ }
+}
+```
+++
+### Querying for Associated Virtual Records
+
+In Task 5 of above, described how to Retrieve Associated Planner Tasks. This operation is supported for all of the virtual tables. When executing this request, you must include a `$filter` query, which specifies the Collaboration Root ID as shown below:
+
+# [Request](#tab/request12)
+
+```http
+ HTTP/1.1 GET https://[Organization URI]/api/data/v9.0/ m365_graphplannertasks?$filter=m365_collaborationrootid eq '{{collaborationRootId}}'&$select=m365_graphplannertaskid,m365_title,m365_createddatetime
+```
+++
+* Other filtering options can't be combined with this `$filter` query and if there they'll be ignored.
+* Other filtering must be performed directly on the response from the request.
+
+### Querying for Virtual records with required key attributes
+
+When, Dataverse Web API is called to retrieve multiple records from the following virtual tables a mandatory key attribute is required. Graph Booking Appointments requires a valid `m365_bookingbusinessid` is included in the query. If the key attribute isn't provided, then the request will fail as follows:
+
+# [Response](#tab/response13)
+
+```http
+ HTTP/1.1 400 Bad Request
+```
+
+```json
+
+{
+ "error": {
+ "code": "0x80048d0b",
+ "message": "Key attribute is missing: 'm365_bookingbusinessid'.",
+ ….
+ }
+}
+
+```
+++
+To fix this problem, change the request to this format:
+
+# [Request](#tab/request14)
+
+```http
+ HTTP/1.1 GET https://[Organization URI]/api/data/v9.0/ m365_graphbookingappointments?$filter=m365_bookingbusinessid eq '{{bookingBusinessId}}'
+```
+++
+### Creating virtual records and Graph access control
+
+The virtual tables honor the access control specified for Microsoft Graph. The virtual tables won't permit operations that the user couldn't perform using the Microsoft Graph API. For example, if the user you use to create the Plan is Task 3 and isn't a member of group you use then you'll get 403 Forbidden responses.
platform Whats New https://github.com/MicrosoftDocs/msteams-docs/commits/main/msteams-platform/whats-new.md
Developer preview is a public program that provides early access to unreleased T
| **Date** | **Update** | **Find here** | | -- | | |
+|08/02/2022| Collaboration controls for Teams| Integrate with Teams > [Collaboration controls](samples/collaboration-control.md)|
| 06/30/2022 | Apps for instant meetings, one-on-one, and group calls| Build apps for Teams meetings and calls > [Overview](apps-in-teams-meetings/teams-apps-in-meetings.md)| | 06/16/2022 | Link unfurling for share to teams from web apps| Integrate with Teams > Share to Teams > [Share to Teams from web apps](concepts/build-and-test/share-to-teams-from-web-apps.md) | |05/24/2022| Enhanced collaboration with Live Share SDK | Build apps for Teams meetings > Enhanced collaboration with Live Share > [Overview](apps-in-teams-meetings/teams-live-share-overview.md) |