In this post we look at a behaviour of document libraries in SharePoint that shows items as loading, and how to fix it.
I recently came across something I hadn’t seen before in SharePoint Online when working with document libraries. I was in a library that had more than 30 folders within it, and after the 30th folder the library just displays a sort of pulsing, loading screen similar to the below:
The thing is that nothing actually loads, there is no pagination or way to move to to see any more results, any additional files/ folders or basically any way to navigate further. I decided to dig into this to understand what was causing it and what can be done to resolve.
I found that the issue related to a view setting within the document library. The default view had an item limit set to “limit the total number of items returned to the specified amount”. Changing this effectively solved the problem, as once changed items are displayed in groups of 30, but a “show all” button will appear that allows you to see all the files/ folders. Here’s how to get to the item limit setting and update it:
Open the affecting document library > press the cog > library settings > more library settings.
Scroll down to views > select the default view.
Scroll down and expand item limit.
Change the radio button setting to display items in batches of the specified size.
Things to note
The number of items to display doesn’t have any bearing on modern views. In the screenshot above I’d changed mine to 100 items to display, but after the first 30 files/ folders, the show all button appears.
The show all button is problematic as if you are grouping within your view, when pressed it will apply an empty filter automatically – showing no files and ultimately confusing people. I’ve wrote about this in detail here.
In this post we will look at how the image tags managed metadata column creates issues for ShareGate migrations and how to resolve them.
Image tags were introduced in July 2021 and are automatically added by Microsoft AI to improve search. When images get uploaded into document libraries, SharePoint will analyse them upon upload and tag them based on a set of 37 basic tags. SharePoint will also re-analyse each time an image is updated and update the image tags.
The image tags column is a managed metadata column that isn’t immediately available within a document library. you have to upload an image first, before the image tag column appears – which can take several hours.
When migrating files at scale using migration tools such as ShareGate desktop, you will start to see errors in your migration reports related to the image tags column. In the example below, the details of each failed item showed the same or similar errors:
The way I resolved this issue was to change an option within the migration task itself to ignore the image tag column managed metadata values. To do this I did the following in ShareGate:
In ShareGate desktop > start a copy content migration
Select your source and destination sites
In the copy content screen > select Options
Select Metadata > then expand Document
You will see the image tags column here > change set mapped value to ignore
In this post we look at three different ways you can copy a page from one SharePoint site to another.
The copy/ move features within SharePoint Online were introduced a few years ago, and although they are pretty good, aren’t without their limitations – something I wrote about in 2021. One such limitation is the inability to be able to copy or move site pages from one SharePoint site to another – a frequent request of users and of the SharePoint community to Microsoft, but so far nothing has been implemented.
I’m going to cover a few ways you can copy a site page from site to site, using a variety of different tools and products along the way.
#1 Create a flow in Power Automate
In this example we can use Power Automate to allow users to select the page they want to copy, input the site URL they want to copy to and let the flow do its magic!
Create a new flow in Power Automate > use the instant cloud flow option.
Create a for a selected file trigger > enter the site address and library name.
NOTE: In my example, just entering ‘Site Pages’ resulting in my flow not appearing in the Site Pages library. This seems to be an issue with the for a selected file trigger. In order to get it to show up, I had to use the library ID instead of the library name. To get the library ID:
Open the library settings > more library settings
Copy everything between List=&7B until %7D – this is the library ID
In the for a selected file trigger > add an input
Select text as the user input type > update the input name and input value placeholder text. This user input type will be used to allow users to enter the site URL they wish to copy their pages to.
Add a get file properties action and configure with the following:
Enter the source site address of your site pages library
Enter either site pages, or the ID of your site pages library
Under ID > select ID from the for a selected file trigger
Add a copy file action and configure with the following:
Current site address: source site address of your site pages library
File to copy: Identifier from get file properties
Destination site address: destination site (or whatever you called your user input) from for a selected file
Destination folder: /SitePages
If another file is already there: copy with a new name (optional)
Three steps – that’s it! Now go ahead and test your flow by selecting a site page and copying it to a different site by running your flow.
#2 Use PnP PowerShell
Another way you are able to do this is with PowerShell, in this case I’ll defer to the brilliant SharePoint diary who has a great write up, including all cmdlets you need to copy a page from site to site, or copy all pages. I’ll include the relevant sample for my blog post, but full credit goes to SharePoint diary:
$SourceSiteURL = "https://crescent.sharepoint.com/sites/marketing"
$DestinationSiteURL = "https://crescent.sharepoint.com/sites/branding"
$PageName = "About.aspx"
#Connect to Source Site
Connect-PnPOnline -Url $SourceSiteURL -Interactive
#Export the Source page
$TempFile = [System.IO.Path]::GetTempFileName()
Export-PnPPage -Force -Identity $PageName -Out $TempFile
#Import the page to the destination site
Connect-PnPOnline -Url $DestinationSiteURL -Interactive
Invoke-PnPSiteTemplate -Path $TempFile
The final option we have available to us is to utilize 3rd party migration tools to migrate pages between sites. For this example I’ll be using ShareGate, but there are other migration tools that are able to do the same thing:
Open ShareGate desktop > press copy.
Select copy content only.
Enter the URL of your source site > select the Site Pages library.
Do the same for the destination site.
Select the page from the source location you wish to copy
Under options, make the following configuration changes:
Check preserve authors and time stamps
Uncheck user alerts
Check web parts
Check version history
Uncheck flatten folder hierarchy
Check update links
Check check in as = published
Press start copy. Once completed, you should see two successful migration task items for your copied page:
Now you will find your newly copied page in the destination Site Pages library. In my experience of copying pages using ShareGate, images hosted within a CDN will still be present within your page, as will all the of text, layouts and any formatting. Images that are stored within different sites may error, as will document library/ list web parts that point to different sites also.
The SharePoint Success Site is an extension of the great Microsoft 365 learning pathways site, which allows you to use and create curated playlists within a SharePoint site to offer training and support for users. The SharePoint Success Site is a fairly recent introduction to the learning pathways family and is offered as a standalone deployable option from the SharePoint look book.
How to provision
There are two ways to provision the SharePoint Success Site, either directly from the SharePoint look book, or via the learning pathways site itself.
Provision via the SharePoint look book
The SharePoint Success Site is dependent on the learning pathways site, so you will need to provision that first, or make sure that it is updated to the current version. More information on how to update the learning pathways solution can be found here.
You will need to be a global administrator to provision the SharePoint Success Site (described as tenant admin in the look book)
You will need to have an app catalog site in your SharePoint environment. More details on how to create an app catalog site can be found here
You will need to be an app catalog administrator to provision the SharePoint Success Site
Provision via the learning pathways site
Navigate to the learning pathways site in your SharePoint environment
From the navigation menu > select Learning Pathways Administration
Press the ellipsis … > add content pack
Select the SharePoint Success Site
This will then take you through to the SharePoint look book to follow the steps as described above
Once provisioned, the SharePoint Success Site will be deployed as a separate communication site within your environment. The site uses a content pack installed in the learning pathways site, which will be displayed within the site.
Issues and troubleshooting
Learning pathways errors in the SharePoint Success Site
When I tried to provision the SharePoint Success Site it didn’t work as seamlessly as I expected. For me, after provisioning the site via the SharePoint look book I received the following error across all pages displaying the learning pathways web part:
In this post we demo the ability to download approvals in Microsoft Teams as PDFs for filing, printing or transferring.
Microsoft introduced the ability to save, print and transfer approvals as PDFs in late 2022. With this feature, approval creators are able to save a completed approval request to a PDF file and have the option to print it. At the time of writing, there was very little online about this feature, or what it looks like – so here it is in action!
Demo – save a PDF from approval
There are several ways to trigger a new approval, via Teams chat or channel message, the approvals app or via Power Automate to name a few. In my example, I created a Teams channel approval:
Note: There’s a brief delay after sending your approval before it appears within your activity feed, or the approvals app (approx. 5 minutes). Once it does, you are able to go ahead and approve/ reject it. You cannot save approvals as PDF whilst they are in the ‘requested’ state.
Once the approval has been completed, you can either view the details of the approval (if a channel message) or open the approval up from the approvals app in Teams.
Once your approval is open > press Save as PDF.
A PDF export of the approval window will download into the local downloads folder on your device. The output will look something like the below:
There is no way currently to change the download location of the PDF or change the behaviour. It would be nice it it was configurable to set it to save to a OneDrive location potentially.
There are no standard approval triggers related to this functionality in Power Automate. Again, for the same purpose as above, it would be good to be able to leverage this functionality via Power Automate to route the downloaded PDF to a OneDrive/ SharePoint location.
This is an oldie but a goodie in my opinion, this post will show you how to use library filters in SharePoint to only show items/ files created, or modified by the current user.
The steps below will guide you through the process of updating the view of a list or library to only show items created or modified by the current, logged in user.
Open the list or library you wish to update
From the library actions ribbon > select the current view (for example: all documents)
Press edit current view
Scroll down the edit view page until you get to the filter section
Create the following filter:
NOTE: this example will only show items that were created by OR modified by the current, logged in user. If you want your filter to only show items where both these values are true, change OR to AND.
Press OK to save your changes
Now your view should have updated to only show items created by, or modified by the current, logged in user.
This example is really simple and easy to implement and there isn’t any real impact on your users as nothing is technically being restricted, just filtered out of the default view.
The flip-side of this is that in of itself could be considered a limitation if there is information stored within the list/ library that requires limited permissions. I’ll go into the options available for this later in this post.
However with that said, depending on what permissions you have in place for your list/ library, you could use this approach to secure the contents too.
Consideration #1 – Views don’t change permissions
A “back door” to gaining access to all contents stored in the list/ library would be to use a different view than the set default view to access all items (for example: if you created a new view to follow the below method, but left the default view set to show everything).
The solution to this would be to apply this filter approach to the default view, make sure any other public views follow the same approach and make sure end users don’t have elevated permissions.
Consideration #2 – Ensure permissions are set correctly
The only way an end user could bypass this approach without any “all items” views available, would be if they had the permissions to do so. The permission that controls this is called the Manage Lists permission, which is only granted via the Edit, Design, Full Control, Manage Hierarchy permission levels by default.
If end users aren’t in these groups, your in luck!
Consideration #3 – list/ library contents is not searchable
If you are using views to filter who can see contents within your list/ library then you will need to ensure this setting is updated if the contents needs to be hidden (below example is a document library):
Press the cog button > library settings
Press advanced settings
Under Search > change allow items from this document library to appear in search resultsto No
Consideration #4 – If it’s a list, enable item level permissions
With lists, in advanced settings there is an additional configuration option – item level permissions which allows you to specify which items users can read and edit.
As the heading implies, this consideration only works for lists in SharePoint as the functionality isn’t available out the box for document libraries. SharePoint Maven have written up what the two different levels of item level permissions you can set mean, which you can find here.
Have you ever changed the name of a SharePoint Online site and tried to re-use the old URL for a new site? If you have you have probably encountered an issue where SharePoint admin center will tell you that URL is still in use. Well this is because the URL is, in fact still in use in the form of a redirect.
In 2019, Microsoft introduced the site rename feature within the SharePoint admin center, which also updated site URLs too. Once a URL is updated for a given site, or moved to a different geo location, or as part of a site swap – a redirect is automatically created to ensure any links that were pointing to the prior URL continue to work.
How to use an old site URL
To use on old site URL you need to run the following PowerShell command. Note: You will need the SharePoint administrator role to run this command:
Open the SharePoint Online Management Shell and run the following command:
Microsoft documentation says that a redirect template (Template type: REDIRECTSITE#0) is applied when the site URL is updated, which contains special headers and logic to redirect your browser requests to the new site.
In this post we look at a specific use case for needing a Power Automate flow to be available across all of SharePoint, some of the current limitations of Power Automate and how to overcome them using Encodian Trigr.
Most organisations will have a central location where they store policies, procedures and guidance documents. For most, this would form part of their corporate intranet solution on SharePoint/ Teams, but you also might find yourself getting asked by users “how do I get my policies from my team/ collaborative locations into the the corporate policy library?” – not such an easy answer!
Policies generally can be created by individuals and small groups of people, within the Teams/ SharePoint sites that they have access to for collaboration. For these people, having a way to publish relevant documents from their own collaboration sites to a central policy location in a consistent way makes a great deal of sense and you may think Power Automate is the way to achieve it…however this is not the case! Power Automate flows have a 1:1 relationship with the lists or libraries they are triggered from, so there is no easy way to do this with out-the-box capabilities.
Power Automate is also unable to manually trigger a flow when selecting multiple documents, something else that my scenario requires. This is where Encodian Trigr can really bridge the gap. Trigr makes Power Automate flows available across SharePoint, allowing users to access and run flows from within any library or list.
In my example, I needed to have a flow available across all SharePoint/ Team sites, which would allow all users to select one-to-many documents and publish to a central policy upload center for approval – and here is how I used Encodian Trigr to achieve it:
There is a comprehensive guide on how to deploy the Encodian Trigr app available here. I followed these steps to get Trigr setup in my environment.
Under My flows > + New flow > Automated cloud flow
Give your flow a name
Search and select the Encodian ‘When a user runs a Trigr‘ Power Automate trigger action
NOTE: This was my first time using Encodian Trigr, so I was prompted to provide a connection name and an API key. For the connection name I just entered ‘Encodian connection for flow’, and the API key will be in your welcome email, or available via this link: https://account.encodian.com/trigr/apikey.
You will now see the ‘When a user runs a Trigr‘ trigger action. Enter a title & description for your flow
The ‘When a user runs a Trigr’ Power Automate trigger action provides all of the properties relevant to the files which were selected by the user when the Trigr action was started.
For the next step we are going to use the get file content action. Due to a current limitation of Power Automate, dynamic values are not immediately accessible by the SharePoint action. To get around this, we will just enter hard-coded values at first, then replace them with dynamic values once we have finished configuring the flow.
Get file content
Add a get file content action
Hard-code the site address of the site where the files are saved that you wish to publish
Hard-code the file identifier as just the ID number for now
Send an email
Add a send an email action with the the following confirguration:
To: User Email Address dynamic content from the ‘when a user runs a Trigr’ trigger action’
Subject: Anything you wish
Body: Anything you wish
Update get file content
Now we will go back to our get file content action and update the hard-coded values with dynamic content from the ‘when a user runs a Trigr’ trigger action’:
Open the get file content action
Update Site Address to Site Address dynamic content from the ‘when a user runs a Trigr’ trigger action’
Update File Identifier to File Identifiers
NOTE: This will create put all your actions in an apply to each loop, which is what we want if we want to be able to process multiple documents. The File Identifier dynamic content will be replaced with the current item from the apply to each loop.
Add a copy file action after the update get file content action and configure with the following properties:
Current site address: site address dynamic content from the ‘when a user runs a Trigr’ trigger action
File to copy: Current item apply to each dynamic content
Destination site address: select/ hard-code the destination site address (in my case the policy site)
Destination folder: select/ hard-code the destination library/ folder
If another file is already there:replace
Create the Trigr action
So far we have installed trigr in our environment, created the flow which will be used and now we need to create the Trigr action in the Encodian account portal:
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.
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.
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
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.
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.
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.
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:
An alphabet list that will act as our index, storing all the letters of the alphabet as list items.
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
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
Save your view under a new name, I called mine “alphabet filter view”. The end result will look like the below:
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
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.
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.
Save the view and give it a new name. I called mine “Contact cards”. The result will look like the below:
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
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
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.
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.
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.
This web part can be downloaded from GitHub and installed into your tenant.
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.
This web part needs to be packaged into a solution before installing into your tenant.