Modern SharePoint sites on standard release will soon receive an update to add a search box to the top Office 365 bar. This allows you to search by default in the current location, like a site or a document library.
You can then configure the site to redirect user’s search queries to a custom search page and you can use the amazing PnP Modern Search web parts to create a great search experience
But what if you want to pass the context of the current location to the custom search page and keep searching only on that location by default?
SharePoint Framework application customizer
To pass the context of the current location to the custom SharePoint search page you can create an SPFx application customizer that you can add to the Top placeholder and use it to redirect the user to the search page, passing the context as a URL parameter.
An implementation example may look like this, adding a button below the search box, but you are free to decide how your component will look.
Update your Application Customizer class to use the following function to identify the source Url
private _getSrcUrl = (): string => {
// set site url as default
let url: string = this.context.pageContext.web.absoluteUrl;
// if list or library and not Site Pages
if (this.context.pageContext.list
&& this.context.pageContext.list.serverRelativeUrl
&& this.context.pageContext.list.serverRelativeUrl.indexOf('SitePages') < 0) {
if (this.context.pageContext.web.serverRelativeUrl !== '/') {
// librarie's root folder
const listUrlPart = this.context.pageContext.list.serverRelativeUrl.replace(this.context.pageContext.web.serverRelativeUrl, '');
url += listUrlPart;
} else {
url += this.context.pageContext.list.serverRelativeUrl;
}
}
return url;
}
On the onClick event of the button, add the following code
const onClick = () => {
// this.props.srcUrl contains the value returned from the previous function that was passed to the React component as a property
let url = this.props.srcUrl && this.props.srcUrl !== '' ? this.props.srcUrl : window.location.href;
// get url parameters
const href: any = new URL(window.location.href);
// try to get relative path from id parameter - when exploring through views
let relativePath = href.searchParams.get("id");
if (!relativePath) {
// try to get relative path from RootFolder parameter - when accessing the folder via direct URL
relativePath = href.searchParams.get("RootFolder");
}
if (relativePath) {
// if inside a folder, build the url to include the full path to the folder
url = window.location.origin + encodeURIComponent(relativePath);
}
const w = window.open(`${customSearchPageUrl}?src=${url}`, '_blank').focus();
}
In summary, it generates a link to the search page and adds an src parameter with the current location. This needs to be done on the click event so that it always gets the correct location when exploring document library folders as the location is retrieved from the URL on the document library (because of current issues related to this.context.application.navigatedEvent).
A sample URL generated may look like this
https://contoso.sharepoint.com/sites/MySite/SitePages/Search.aspx?src=https://contoso.sharepoint.com%2Fsites%2FMySite%2FMyLibrary%2FMyFolder1%2FMyFolder2
Custom modern search page
I will not cover how to fully set up a custom search page using the PnP Modern Search web parts in this post. I will only cover how to use the location information available on the URL to limit the search scope.
To create search “zones”, we are going to use the Search Verticals web part. In the configuration, add two entries that use the same Result Source Identifier that contains all the results. Then on the “Current Location” vertical, set the query template to {searchTerms} {?Path:”{QueryString.src}”}
The “Current Location” vertical will now only display results that have a Path value starting with the URL provided.
If you now test the solution (you can test just by adding different values to the src URL parameter) you will see that the results under “Current Location” are respecting the value provided.
The PnP Modern Search web parts are a great addition to your SharePoint sites. Not only do they improve the search experience with the standard features, but they can only be configured to react to properties and configurations on your page.