Microsoft 365 roadmap roundup – 17th October 2022

Use the links below to switch between each product’s roadmap updates:

SharePoint
Teams
OneDrive
Microsoft Information Protection

OneDrive

  • Launched (0)
  • Rolling out (1)
  • In development (2)

🍾 LAUNCHED

N/A

🚂 ROLLING OUT

  • OneDrive: Sharing experience  – Share menu dropdown – We’re updating the Share menu to provide easy access to additional sharing options like Email, Copy link, Teams chat as well as Manage access settings. Feature ID:83727

⌛ IN DEVELOPMENT

Release – October 2022

  • 🆕 OneDrive: Sharing Experiences – simplifying external sharing – We want to simplify the sharing journey when a customer would like to collaborate with someone outside of their organization. Roadmap ID: 100713
  • 🆕 OneDrive: Sharing Experiences – Sensitivity Labels in the sharing dialog – We’re adding sensitivity labels to the sharing dialog to help better secure your company data and compliance. Roadmap ID: 100714

Microsoft Search demystified! Provide configurable search options in SharePoint, Teams & OneDrive

Microsoft Search is the unified search experience that is prevalent across Microsoft 365. Microsoft Search gives users contextual search results depending on the app they search from, be it form Word or Excel, through to SharePoint, Teams & OneDrive.

Intro

If your familiar with SharePoint search you might think this is a doddle to set up. Know your crawled properties from content sources? Managed metadata from managed properties? Well, this might not help you for modern search as not all contextual app based search results are created equally, specifically Teams and SharePoint…

Within the settings of the M365 admin center there is section called search & intelligence where you can gain access to the following configurable options within Microsoft Search:

  • Acronyms: Admin or system curated acronyms/ abbreviations used by an organisation or team
  • Bookmarks: Helps users find important information with just a search. Each bookmark includes a title, URL,  keywords and a category.
  • Floor plans: Floor plans in Microsoft Search help users find people, rooms, and spaces within a building.
  • Locations: Helps your users find addresses and locate your organization’s buildings by providing an accurate location.
  • Power BI: Support for Power BI dashboards and reports to make it easier for users to find data & analytics
  • Q&A: Creating a Q&A is similar to creating bookmarks. Answer user’s questions instead of just providing a link to a webpage.
  • Result types & verticals: Result types define how search results are shown on the page based on conditions and rules. Search verticals are tabs on the search results page that show results of a specific type or from a select source.

The problem

For all of the above options within Microsoft 365, there is a varied amount of consistency as to how each option displays within specific apps, or in some cases do not display at all. For SharePoint all of the above search options do not display in the default search results of a given site. SharePoint communication or team sites search scope is to search just the site by default. Hub sites will search the hub, plus any associated sites to the hub.

None of the above search options display from within Teams, either via the desktop app or via the browser. There also isn’t a link to organisation, or a way to see all files etc. from the search experience within Teams.

Microsoft documentation says that Acronyms, Bookmarks, Floor plans & Location only show answers on Bing, SharePoint, and Office 365. Power BI search results display in the Windows search box, SharePoint, Office 365, and Bing.

Solutions and workarounds

I only really have a solution as such for SharePoint on this one, as for Teams and OneDrive there is very little you can do to change the search result options as far as I know.

For SharePoint, the only way currently to get these options to show is to change the scope of your site. There are three search scope parameters:

  • 0 – default scope, effectively site
  • 1 – tenant
  • 2 – hub
  • 3 – site

To change the scope of your site search, you need PowerShell/ PnP. You’ll also need to be a SharePoint admin to run it, but if you are you can run this cmdlet to change the scope to tenant wide:

Connect-PnPOnline -Url https://contosodemosg.sharepoint.com/sites/Strategy -UseWebLogin
# this will prompt you to sign into your site. Use the site owner credentials to sign in

$web = Get-PnPWeb
$web.SearchScope = 1
# 1 for Tenant, 2 for Hub, 3 for Site, 0 for default behavior

$web.Update()
Invoke-PnPQuery

Once your cmdlet has run successfully, you’ll notice the change in the site targeted as when a search is initiated it will default to the “organisation” wide search results by default, showing any of the configurable options you’ve set up within Microsoft Search.

SharePoint site configured to have a tenant-wide search scope, showing a custom configured location within the search results page.

For OneDrive on web, the search experience is subtly different than SharePoint or Teams. When you search there are the following options via a drop-down: My files, All files, or Whole organisation. All files is the default setting, but you can select the scope of your search before hitting enter, or change the scope after your results are returned.

In OneDrive for web, there is a toggle within the search bar that lets you select the search scope.

Things to consider

#1 Intranet search results will not be scoped

If you are building an intranet solution or already have one in place, changing the search scope will bring in search results from Teams, SharePoint & OneDrive, so it will not be ring fenced to just “intranet” content.

#2 All sites which require the scope change will need updating

You will need to change the scope for all the sites you wish to search tenant wide. So if you have an intranet solution, all sites will need this change applying.

#3 Ensure you have the correct admin roles

When I was creating Bookmarks/ Answers/ Locations etc. I originally gave my account the Search Administrator role. This displayed more config options within search & intelligence, but when it came to publishing, it threw up the dreaded “something went wrong” error. To be able to publish, I needed to also apply the Search Editor role.


Microsoft 365 roadmap roundup – 10th October 2022

OneDrive

  • Launched (0)
  • Rolling out (1)
  • In development (1)

🍾 LAUNCHED

  • N/A

🚂 ROLLING OUT

  • Microsoft OneDrive: Granular controls for Request Files Links & Anyone Links – These policy changes will make it possible for customers to enable the Request Files scenario on OneDrives without also enabling file & folder Anyone links. Roadmap ID: 98097

⌛ IN DEVELOPMENT

Release – October 2022

  • OneDrive: Known Folder Move for macOS – You’ll be able to roll out Known Folder Move (KFM) for your macOS users and redirect their Desktop, Documents and Pictures folders to OneDrive. Roadmap ID: 82032

Microsoft 365 roadmap roundup – 3rd October 2022

OneDrive

  • Launched (0)
  • Rolling out (1)
  • In development (1)

🍾 LAUNCHED

N/A

🚂 ROLLING OUT

  • OneDrive: Known Folder Move for macOS – You’ll be able to roll out Known Folder Move (KFM) for your macOS users and redirect their Desktop, Documents and Pictures folders to OneDrive. Roadmap ID: 82032

⌛ IN DEVELOPMENT

Release – October 2022

  • OneDrive: Sharing experience  – Share menu dropdown – We’re updating the Share menu to provide easy access to additional sharing options like Email, Copy link, Teams chat as well as Manage access settings. Feature ID:83727

How to create an address book in SharePoint Online

In this post we take a look at a few of the different ways an address books can be created in SharePoint Online.

  1. Intro
  2. Example 1 – dynamic list filtering
    1. Create the alphabet list
    2. Create the contacts list
    3. Create the address book page
    4. Bonus! Populate the contacts list from M365 user data
  3. Example 2 – Custom SharePoint Framework address book web parts
    1. People Directory SPFx sample
    2. Organization Directory SPFx sample

Intro

The idea for this post came from reader George’s comment asking to do a demo of how an address book can be created in SharePoint. From my research there is already quite a bit out there on how to do this already, but here are my two ways to create an address book.

Example 1 – dynamic list filtering

This example is a pure out of the box, SharePoint solution for creating an address book feature. For this example we will use dynamic filtering between two lists to show a certain set of values when an option is selected.

To start we will need to create two lists:

  1. An alphabet list that will act as our index, storing all the letters of the alphabet as list items.
  2. A contacts list that will be the list that contains all the address book data.

Create the alphabet list

  • Start by creating a new custom list > call the list Alphabet.
  • Create new items in the list for each letter of the alphabet. I used ‘edit in grid mode’ to speed this process up
Create an Alphabet list to store the A-Z letters as list items.
  • Change the view to a gallery view
  • From here, format the list view using either the example JSON list view formatting below, or create your own to style the A-Z list to display each letter as a button
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/tile-formatting.schema.json",
  "height": 45,
  "width": 53,
  "hideSelection": false,
  "fillHorizontally": true,
  "formatter": {
    "elmType": "div",
    "attributes": {
      "class": "sp-card-container"
    },
    "children": [
      {
        "elmType": "button",
        "attributes": {
          "class": "sp-card-defaultClickButton",
          "role": "presentation"
        },
        "customRowAction": {
          "action": "defaultClick"
        }
      },
      {
        "elmType": "div",
        "attributes": {
          "class": "ms-bgColor-white sp-css-borderColor-neutralLight sp-card-borderHighlight sp-card-subContainer"
        },
        "children": [
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-card-lastTextColumnContainer"
            },
            "children": [
              {
                "elmType": "p",
                "attributes": {
                  "title": "[$Title]",
                  "class": "ms-fontColor-neutralPrimary sp-card-content sp-card-highlightedContent"
                },
                "txtContent": "=[$Title]",
                "style": {
                  "text-align": "left",
                  "font-size": "0.8em",
                  "font-weight": "bold"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}
  • Save your view under a new name, I called mine “alphabet filter view”. The end result will look like the below:
Example gallery list view formatting to display A-Z as buttons.

NOTE: There was an original example for this I found online many months ago, but I cant for the life of me find it. If anyone knows where this example came from, leave a message in the comments and I’ll credit it in this post.

Create the contacts list

Next, we need to create the contacts list. If you already have your user data held somewhere else, you can always create your new contacts list from Excel.

  • Once the contacts list is created, create a new lookup column with the following configuration:
    • Give your lookup column a name. I called mine “AZLookup”
    • Require that this column contains information = No
    • Enforce unique values = No
    • Get information from: Alphabet
    • In this column: Title
    • Press Save
Create a lookup column to connect to the Alphabet list.
  • Now you need to update each item in the contacts list, to ensure each item has an A-Z value in the lookup column. Again, for this I used “edit in grid view” to speed things up.
Update the contacts list to include values in the lookup column.
  • Switch to the gallery view and format the list using either the example JSON list view formatting below, or create your own to style the contacts list in a way that suits your needs.
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/tile-formatting.schema.json",
  "height": 166,
  "width": 300,
  "hideSelection": false,
  "fillHorizontally": true,
  "formatter": {
    "elmType": "div",
    "attributes": {
      "class": "sp-card-container"
    },
    "children": [
      {
        "elmType": "button",
        "attributes": {
          "class": "sp-card-defaultClickButton",
          "role": "presentation"
        },
        "customRowAction": {
          "action": "defaultClick"
        }
      },
      {
        "elmType": "div",
        "attributes": {
          "class": "ms-bgColor-white sp-css-borderColor-neutralLight sp-card-borderHighlight sp-card-subContainer"
        },
        "children": [
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-card-previewColumnContainer"
            },
            "children": [
              {
                "elmType": "div",
                "style": {
                  "display": "flex"
                },
                "children": [
                  {
                    "elmType": "p",
                    "attributes": {
                      "class": "sp-card-userEmptyText"
                    },
                    "txtContent": "=if(length([$DisplayName]) == 0, '–', '')"
                  },
                  {
                    "forEach": "personIterator in [$DisplayName]",
                    "elmType": "a",
                    "attributes": {
                      "class": "=if(loopIndex('personIterator') >= 5, 'sp-card-userContainer', 'sp-card-userContainer sp-card-keyboard-focusable')"
                    },
                    "style": {
                      "display": "=if(loopIndex('personIterator') >= 5, 'none', '')"
                    },
                    "children": [
                      {
                        "elmType": "img",
                        "defaultHoverField": "[$personIterator]",
                        "attributes": {
                          "src": "=getUserImage([$personIterator.email], 'S')",
                          "title": "[$personIterator.title]",
                          "class": "sp-card-userThumbnail"
                        },
                        "style": {
                          "display": "=if(length([$DisplayName]) > 5 && loopIndex('personIterator') >= 4, 'none', '')"
                        }
                      },
                      {
                        "elmType": "div",
                        "attributes": {
                          "class": "ms-bgColor-neutralLight ms-fontColor-neutralSecondary sp-card-userOthers"
                        },
                        "style": {
                          "display": "=if(length([$DisplayName]) > 5 && loopIndex('personIterator') == 4, '', 'none')"
                        },
                        "customCardProps": {
                          "formatter": {
                            "elmType": "div",
                            "attributes": {
                              "class": "sp-card-personCallout"
                            },
                            "children": [
                              {
                                "forEach": "personIterator in [$DisplayName]",
                                "elmType": "div",
                                "attributes": {
                                  "class": "sp-card-userContainer sp-card-userCustomCard"
                                },
                                "style": {
                                  "display": "=if(loopIndex('personIterator') < 4, 'none', '')"
                                },
                                "children": [
                                  {
                                    "elmType": "img",
                                    "defaultHoverField": "[$personIterator]",
                                    "attributes": {
                                      "src": "=getUserImage([$personIterator.email], 'S')",
                                      "title": "[$personIterator.title]",
                                      "class": "sp-card-userThumbnail"
                                    }
                                  }
                                ]
                              }
                            ]
                          },
                          "openOnEvent": "hover"
                        },
                        "children": [
                          {
                            "elmType": "span",
                            "txtContent": "='+' + toString(length([$DisplayName]) - (4))"
                          }
                        ]
                      }
                    ]
                  },
                  {
                    "elmType": "div",
                    "attributes": {
                      "class": "sp-card-userTitle"
                    },
                    "style": {
                      "display": "=if(length([$DisplayName]) == 1, '', 'none')"
                    },
                    "defaultHoverField": "[$personIterator]",
                    "txtContent": "[$DisplayName.title]"
                  }
                ]
              }
            ]
          },
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-card-displayColumnContainer"
            },
            "children": [
              {
                "elmType": "p",
                "attributes": {
                  "title": "[$FirstName]",
                  "class": "ms-fontColor-neutralPrimary sp-card-content sp-card-highlightedContent",
                  "role": "heading",
                  "aria-level": "3"
                },
                "txtContent": "=if ([$FirstName] == '', '–', [$FirstName])"
              }
            ]
          },
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-card-displayColumnContainer"
            },
            "children": [
              {
                "elmType": "p",
                "attributes": {
                  "title": "[$Surname]",
                  "class": "ms-fontColor-neutralPrimary sp-card-content "
                },
                "txtContent": "=if ([$Surname] == '', '–', [$Surname])"
              }
            ]
          },
          {
            "elmType": "div",
            "attributes": {
              "class": "sp-card-lastTextColumnContainer"
            },
            "children": [
              {
                "elmType": "p",
                "attributes": {
                  "title": "[$Email]",
                  "class": "ms-fontColor-neutralPrimary sp-card-content "
                },
                "txtContent": "=if ([$Email] == '', '–', [$Email])"
              }
            ]
          }
        ]
      }
    ]
  }
}
  • Save the view and give it a new name. I called mine “Contact cards”. The result will look like the below:
Contacts list with list view formatting applied.

Create the address book page

Now are lists are created and formatted, it’s time to create a new page, add our web parts and start dynamic filtering!

  • Create a new page, select any template you like
  • In a new one column section, add a new list web part > select the Alphabet list
  • Edit the web part and make the following changes:
    • Change the view to Alphabet Filter View
    • Set the size to small – about 5 items
    • Hide the command bar
    • Hide the see all button
  • Press Apply
  • Either in the same or new one column section, add a new list web part > select the Contacts list
  • Edit the web part and make the following changes:
    • Change the view to Contact Cards
    • Set the size to autosize – fit to number of items
    • Hide the command bar
    • Hide the see all button
    • Turn dynamic filtering on
    • Column in Contacts to filter = AZLookup
    • List or library containing the filter value: Alphabet
    • Column containing the filter values properties: Title
  • Press Apply

You will now be able to dynamically filter your contacts list using the A-Z buttons on the address book page!

Bonus! Populate the contacts list from M365 user data

When creating this demo I thought to myself “wouldn’t it be great if you could populate the contacts list from data already in Microsoft 365”. I thought it was a good idea so I created a Power Automate flow to get all the user data from M365 and add it to the contacts list.

Power automate flow to populate the contacts list with user data from Microsoft 365.

The flow uses the search for users (V2) action that, if no search terms are added, will bring back all the users within Microsoft 365 within the flow. Once that action has retrieved all the users, the create item action, wrapped within an apply to each creates a new item within the contacts list for each user the search for users action has found, populating the columns in the contacts list with dynamic content from the previous action.

NOTE: There is a pagination setting that will need updating if you have more than the threshold limit of 1000 users.

Pagination setting within the search for users (V2) action.

This flow was really just to prove the concept, so it runs on a manual basis. If you were to want to do something like this I would suggest having a one time “import of all the user profile data into the contacts list, then a separate, flow that runs on a longer schedule that only runs if certain conditions are met (for example: if the email address doesn’t already exist in the contact list).

Example 2 – Custom SharePoint Framework address book web parts

There are several SharePoint framework (SPFx) sample solutions available from GitHub that work as address books, connecting to user data in Microsoft 365 and allowing you to browse and search for users. Not all samples are offered as downloadable solutions packages, sometimes you will need to package & deploy them manually. I’ve got a post here that covers everything you need to do 🙂

People Directory SPFx sample

This sample was made available as part of the PnP starter kit (formerly the SharePoint starter kit), which I installed and have been using in my tenant since 2019 without issue. This web part lets you browse an A-Z, as well as being able to search for users.

People Directory SPFx sample.

This web part can be downloaded from GitHub and installed into your tenant.

Link to the sample: https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-people-directory

Organization Directory SPFx sample

This sample allows you to browse an A-Z, as well as being able to search for users and sort the results by job title, first name, last name etc. When a user is found, a profile hover card is displayed is the same as the rest of Microsoft 365.

Organization Directory SPFx sample.

This web part needs to be packaged into a solution before installing into your tenant.

Link to sample: https://github.com/pnp/sp-dev-fx-webparts/tree/main/samples/react-directory


Microsoft 365 roadmap roundup – 26th September 2022

Use the links below to switch between each product’s roadmap updates:

SharePoint
Teams
OneDrive
Microsoft Information Protection

OneDrive

  • Launched (0)
  • Rolling out (0)
  • In development (2)

🍾 LAUNCHED

N/A

🚂 ROLLING OUT

N/A

⌛ IN DEVELOPMENT

Release – October 2022

  • OneDrive: Activity column in My Files – When you navigate to the “My Files” page in OneDrive for Business Web, you’ll see an Activity column that shows which of your shared documents have unseen edits and comment. Roadmap ID: 88913

Release – November 2022

  • OneDrive: Sync app- Automatic Account Configuration – The OneDrive sync app will automatically sign in if there are existing credentials available to Microsoft applications (Teams, Office, Edge, Windows). Roadmap ID: 93242

Microsoft 365 roadmap roundup – 19th September 2022

Use the links below to switch between each product’s roadmap updates:

SharePoint
Teams
OneDrive
Microsoft Information Protection

OneDrive

  • Launched (0)
  • Rolling out (0)
  • In development (1)

🍾 LAUNCHED

N/A

🚂 ROLLING OUT

N/A

⌛ IN DEVELOPMENT

Release – December 2022

  • 🆕 Microsoft Stream: Video and audio embed code for use on internal web sites – With this feature users can get an embed code for an audio or video file that is uploaded to or stored in SharePoint, OneDrive, Teams, or Yammer. The embed code renders the audio or video source file in a player and can be used on intranets or internal websites. Note: If the user is logged into the internal site or intranet where the embedded player is featured, but is not logged into M365, then they will be asked to login to M365 to view the content. If the user does not have permission to view the content, then a modal will surface in place of the video which will allow the user to request access to the audio or video file. Roadmap ID: 98198

Microsoft 365 roadmap roundup – 12th September 2022

Use the links below to switch between each product’s roadmap updates:

SharePoint
Teams
OneDrive
Microsoft Information Protection

OneDrive

  • Launched (1)
  • Rolling out (0)
  • In development (0)

🍾 LAUNCHED

  • OneDrive: New information architecture on iOS – To make it easier to discover options, OneDrive on iOS has a new information architecture (IA) using the bottom sheet to show all commanding options. Feature ID:85571

🚂 ROLLING OUT

N/A

⌛ IN DEVELOPMENT

N/A


Microsoft 365 roadmap roundup – 5th September 2022

Use the links below to switch between each product’s roadmap updates:

SharePoint
Teams
OneDrive
Microsoft Information Protection

OneDrive

  • Launched (1)
  • Rolling out (0)
  • In development (2)

🍾 LAUNCHED

  • OneDrive: Review mode for Word documents in the sharing dialog – In any Word document, share a document for review by clicking the Share button, and then clicking the Share command in the menu. In Word for the web, add the people that you want to review the document, and then select the Can review option. Roadmap ID: 93400

🚂 ROLLING OUT

N/A

⌛ IN DEVELOPMENT

Release – September 2022

  • OneDrive: Sharing experience  – Share menu dropdown – We’re updating the Share menu to provide easy access to additional sharing options like Email, Copy link, Teams chat as well as Manage access settings. Feature ID:83727
  • OneDrive: Activity column in My Files – When you navigate to the “My Files” page in OneDrive for Business Web, you’ll see an Activity column that shows which of your shared documents have unseen edits and comment. Roadmap ID: 88913