Skip to content

Commit 51529dd

Browse files
authored
Merge pull request #3409 from microsoft-search/develop
v4.10.0
2 parents 156cc90 + 8d095ea commit 51529dd

File tree

104 files changed

+65615
-67670
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+65615
-67670
lines changed

.github/workflows/publish.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818
with:
1919
ref: develop
2020
# setup nodejs
21-
- name: Use Node.js 14
21+
- name: Use Node.js 16
2222
uses: actions/setup-node@v2
2323
with:
24-
node-version: 14
24+
node-version: 16
2525
registry-url: "https://registry.npmjs.org"
2626
# cache node modules
2727
- name: Cache node modules

.github/workflows/release.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121

2222
strategy:
2323
matrix:
24-
node-version: [14.x]
24+
node-version: [16.x]
2525

2626
outputs:
2727
majorMinorPatch: ${{ steps.setoutputs.outputs.majorMinorPatch }}

README.md

+9
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ contact [[email protected]](mailto:[email protected]) with any additio
2424

2525
## "Sharing is Caring"
2626

27+
## "PnP Modern Search Office Hours"
28+
If you are stuck on an issue or just need a peer review of your PnP Modern Search based idea, we have Office Hours.
29+
30+
You can sign up for a 15 min timeslot and a member of the community will set up a Teams call, where you can show and tell about the issue.
31+
Office hours is every second Tuesday at mid afternoon UTC(0).
32+
33+
Sign up [here](https://aka.ms/pnp/modernsearchofficehours), and please note that not all requests might be granted if there are more requests than timeslots.
34+
35+
2736
## Disclaimer
2837

2938
**THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.**

docs/assets/NoAccessError.png

150 KB
Loading
80.1 KB
Loading

docs/extensibility/web_components_list.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ Here are the list of all **reusable** web components you can use to customize yo
189189
data-secondary-text="Unknown"
190190
data-tertiary-text=""
191191
data-optional-text="514 928 0000"
192-
data-persona-size="" >
192+
data-persona-size=""
193+
data-native-lpc=true >
193194
</pnp-persona>
194195
```
195196

@@ -201,6 +202,7 @@ Here are the list of all **reusable** web components you can use to customize yo
201202
|**data-tertiary-text**|The tertiary text to display (ex: work phone).
202203
|**data-optional-text**|The optional text to display.
203204
|**data-persona-size**|The size of the persona **item** to display (no only the picture). Valid values are <ul><li>tiny = 0</li><li>extraExtraSmall = 1</li><li>extraSmall = 2</li><li>small = 3</li><li>regular = 4</li><li>large = 5</li><li>extraLarge = 6</li></ul>
205+
|**data-native-lpc**|Enable SharePoint native Live Persona Card on hover.
204206

205207
## `<pnp-img>`
206208
- **Description**: Display an image with support for fallback behavior.

docs/installation.md

+18-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
# Installation
22

3-
1. Download the latest SharePoint Framework packages **pnp-modern-search-parts.sppkg** from the [GitHub repository](https://github.com/microsoft-search/pnp-modern-search/releases).
4-
2. Add **pnp-modern-search-parts.sppkg** to the global tenant app catalog or a site collection app catalog. If you don't have an app catalog, follow this [procedure](https://docs.microsoft.com/en-us/sharepoint/use-app-catalog) to create one.
3+
1. Download the latest SharePoint Framework packages **pnp-modern-search-parts-v4.sppkg** from the [GitHub repository](https://github.com/microsoft-search/pnp-modern-search/releases).
4+
2. Add **pnp-modern-search-parts-v4.sppkg** to the global tenant app catalog or a site collection app catalog. If you don't have an app catalog, follow this [procedure](https://docs.microsoft.com/en-us/sharepoint/use-app-catalog) to create one.
55

6-
!["App Catalog "](./assets/app_catalog.png){: .center}
6+
!["App Catalog "](./assets/installation-enable-app.png){: .center}
77

88
> * The packages are deployed in the general Office 365 CDN meaning **we don't host any code**.
99
10-
> * For the **pnp-modern-search-parts.sppkg** package, you can choose to make the solution available in [all sites](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/tenant-scoped-deployment) or force to install an app to the site every time.
10+
> * For the **pnp-modern-search-parts-v4.sppkg** package, you can choose to make the solution available in [all sites](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/tenant-scoped-deployment) or force to install an app to the site every time.
1111
1212
> * The solution asks the following API permissions by default to enhance the experience. These permissions are **not mandatory**. If you don't accept them, you will simply have less available features.
1313
1414
> * You can approve scopes from the API Access screen in the SharePoint Admin Center: https://&lt;tenant&gt;-admin.sharepoint.com/_layouts/15/online/AdminHome.aspx#/webApiPermissionManagement If you'd like more details on this step, please see the [Approving Scopes](#approving-scopes) section below.
1515
1616
| Requested API permission | Used for |
1717
| -------------- | --------- |
18+
| _Presence.Read.All_ | Read presence information of all users in your organization.
1819
| _User.Read_ | The Microsoft Graph Toolkit [persona card](https://docs.microsoft.com/en-us/graph/toolkit/components/person-card#microsoft-graph-permissions) in the people layout. |
1920
| _People.Read_ | Same as above.
2021
| _Contacts.Read_ | Same as above.
@@ -27,9 +28,9 @@
2728
| _Bookmark.Read.All_ | Allow search for Bookmarks in Microsoft Search in your organization.
2829
| _Acronym.Read.All_ | Allow search for Acronyms in Microsoft Search in your organization.
2930
| _Chat.Read_ | Allow search for Teams messages.
30-
| _ChannelMessage.Read.All_ | Same as above.
31+
| _ChannelMessage.Read.All_ | Read user channel messages.
3132

32-
3. Add the Web Parts to a SharePoint and start building!
33+
4. Add the Web Parts to a SharePoint and start building!
3334

3435
!["Available Web Parts"](./assets/webparts.png){: .center}
3536

@@ -44,3 +45,14 @@ You'll need to approve each request one at a time. If you have questions about w
4445
After you approve each request your view will be as shown in the screenshot below.
4546

4647
!["App Catalog"](./assets/api-access-approved.jpg){: .center}
48+
49+
50+
## Note about Guest users
51+
52+
By default guest users do not have access to the App Catalog. So if you are not using the CDN option, any SPFx web part from the App Catalog will show an error message for guest users:
53+
![No Access Error](./assets/NoAccessError.png){: .center}
54+
55+
There are basicly two options to solve this issue,
56+
give guest users access to the App Catalog (read) or use the CDN option.
57+
58+
see [this](https://laurakokkarinen.com/sharepoint-online-guest-user-troubles-and-how-to-get-past-them/) for more information.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
2+
A common requirement for intranets is to show birthdays of employees.
3+
And as the SharePoint User Profile Application has a property for birthdays, it is a natural choice to use search to show birthdays of employees.
4+
5+
(as of writing this (2023), the Graph API does not have a property for birthdays, so we can't use the Graph API to get the information)
6+
7+
8+
9+
The tricky part is that in the User profile application the birthday value is store is a rather usual datatype "date no year"
10+
11+
![Birthday in the User Provisioning Service](../assets/../scenarios/assets/Setup-Results-web-part-to-show-birthdays/BirthdayUPA.png)
12+
13+
14+
In my tenant the SPS-Birthday property was mapped to RefinableDate00 and the actual value in the property is 2000-[the date]:
15+
16+
![Managed Property value](../assets/Setup-Results-web-part-to-show-birthdays/refinabledate00.png)
17+
18+
(use the magnificent [SP Editor tool](https://chrome.google.com/webstore/detail/sp-editor/ecblfcmjnbbgaojblcpmjoamegpbodhd) or [SP Search Query Tool](https://github.com/pnp/PnP-Tools/blob/master/Solutions/SharePoint.Search.QueryTool/README.md) to inspect the managed properties)
19+
20+
21+
22+
So, the query had to be something like "those accounts where RefinableDate00 = 2000 + the value of today's date
23+
24+
25+
26+
In KQL we have the token "today" that will give us today's date, but as far as I know, we can't get the components the date consist of, like Month and Day.
27+
28+
Luckily, the PnP Modern search provides additional Tokens, see [Tokens](https://microsoft-search.github.io/pnp-modern-search/usage/search-results/tokens/)
29+
30+
31+
32+
So the final query is:
33+
34+
**RefinableDate00=2000-{CurrentMonth}-{CurrentDate}T00:00:00Z**
35+
36+
37+
38+
( and of cause a criteria to exclude former employees, like SPS-HideFromAddressLists<>1)
39+
40+
![Birthday web part](../asserts/../scenarios/assets/Setup-Results-web-part-to-show-birthdays/birthdays.png)
41+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
2+
Getting PnP Modern Search to show work anniversaries should be easy enoght, right? Just add a couple of managed properties and a couple of web parts and you are done. Well, not quite.
3+
4+
The problem is that date manipulation in KQL is hard at best and sometimes impossible. In order to find a work anniversary you must compare Today and the Hiredate managed property, but ONLY the day and month part.
5+
6+
Calculating how many years the employee has been with the company is also required and it seems like there is no way to get that using KQL.
7+
8+
![upa](../scenarios/assets/Setup-Results-web-part-to-show-work-anniversaries/upa.png)
9+
10+
## Objective
11+
12+
We want to be able to display two options:
13+
- Employees having a work anniversary today, and also how many years they have been with the company
14+
- Employees having a work anniversary within the next 7 days + number of years.
15+
16+
## How to cheat
17+
In order to achieve the objectives, I had to get:
18+
- The account
19+
- The hiredate, but with the year segment being the current year
20+
- The number of years the employee has been with company at the next anniversary
21+
22+
![birthdayAndHiredateSynclist](..\assets\Setup-Results-web-part-to-show-work-anniversaries\BirthdayAndHiredateSyncList.png)
23+
24+
Lets add birthdayThisYear while I was at it, in order to be able to show upcoming birthdays.
25+
26+
27+
The basic idea is that we want to change the hiredate from eg. 10/26/2005 to 10/26/2023 as that allows us to compare Today with this value 😀
28+
(RefinableDate12 is mapped to the HiredateThisYear property)
29+
30+
Who is having a work anniversary today?
31+
32+
*RefinableDate12=Today*
33+
34+
Anniversary within the next x days is also a piece of cake:
35+
36+
*RefinableDate12<{Today+7} AND RefinableDate12>{Today}*
37+
38+
## Implementation
39+
Asking the intern to keep the list above in sync would be a cruel and unusual punishment, and hence actually forbidden in the USA, something to do with a constitution or something like that.
40+
41+
The list should of course be synced with the source, in this case the User Profile Application, at least once each month. The reason I am not using Graph is that birthday is not in the schema.
42+
43+
![mapping birthday and hiredate](../scenarios/assets/Setup-Results-web-part-to-show-work-anniversaries/mapping1.png)
44+
45+
**Prereq: Map SPS-Birthday and SPS-Hiredate to RefinableDate00/01 or similar**
46+
47+
Once data is showing up in those RefinableDate properties you should be ready to create the list.
48+
Grab the script here . It will create a few Site Columns and a Content type on the site collection of your choosing. The list is then created, and the Content type added to the list.
49+
The Add-UserDataToList function will query the UPA for accounts and write the data we need to the list.
50+
51+
Hit the Reindex site in the site collections Search and Offline Availability section for the site columns to be picked up by search.
52+
53+
Map the crawled properties to a couple of RefinableDates. If possible it is recommended to make this mapping on the tenant level as it ensures that you can use them in your entire tenant.
54+
![mapping birthdaythisyear and hiredatethisyear](../scenarios/assets/Setup-Results-web-part-to-show-work-anniversaries/mapping2.png)
55+
Find the Content Type ID of the Content type created by the script.
56+
57+
58+
Add a Results web part, name it "Todays work anniversaries"
59+
60+
Set the Query template to:
61+
62+
*Contenttypeid:0x01009290F0FA40E7CB42B55D6D96F897262B\* RefinableDate12=Today*
63+
64+
*(replace 0x01009290F0FA40E7CB42B55D6D96F897262B with the value for the your content type)*
65+
66+
Add a Results web part, name it "Upcoming anniversaries (7 days)"
67+
68+
Set the Query template to:
69+
70+
*Contenttypeid:0x01009290F0FA40E7CB42B55D6D96F897262B\* RefinableDate12<{Today+7} AND RefinableDate12>{Today}*
71+
72+
*(replace 0x01009290F0FA40E7CB42B55D6D96F897262B with the value for your content type)*
73+
74+
75+
76+
Add the managed properties birthdayhiredateAccountOWSUSER, nextWorkAnniversaryInYearsOWSTNMBR, RefinableDate10, RefinableDate12 to the Selected Properties in both web parts.
77+
78+
Enter Layout slots
79+
80+
Change UserEmail to use the birthdayhiredateAccountOWSUSER property
81+
82+
Change Date from Created to RefinableDate12
83+
84+
For both web parts you can select the People layout on "page 2" in the web part configuration.
85+
86+
Set Secondary text to:
87+
88+
{{{Title}}} has been with us {{{nextWorkAnniversaryInYearsOWSTNMBR}}} years
89+
90+
(remember to click Use Handlebars expression)
91+
92+
Set Tertiary text to:
93+
94+
{{getDate (slot item @root.slots.Date) "MMMM-D"}}
95+
96+
(remember to click Use Handlebars expression)
97+
98+
Set the sorting on the Upcoming Anniversaries to RefinableDate12 asc
99+
100+
Run the Add-UserDataToList function in a runbook or similar once a month and you should be done😊 Near the end of the year you might need to run is once per day.
101+
102+
![final result](../scenarios/assets/Setup-Results-web-part-to-show-work-anniversaries/anniversaries.png)
Loading
Loading
Loading
Loading
Loading
Loading
Loading

docs/scenarios/index.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,19 @@ With the Modern Search Web Parts you can create a simple and useful Department W
4848
## [Use query rules for promoted links](Use-query-rules-for-promoted-links.md)
4949
With the Modern Search Web Parts you can show promoted links for important results. They will be configured with query rules in the SharePoint Search Admin Center. Promoted results will show users more informations and direct links about specific, predefined, terms they searching for.
5050

51-
## [Use query string from URL for dynamic search](use-query-string-in-url.md)
5251
This scenario describes how to use query string as value in the URL from the current page. You can use URL query string parameters to build dynamic search pages.
5352
Use a library with metadata that you can use the query string parameter in the URL.
5453

54+
55+
56+
## [Setup Results web part to show birthdays](Setup-Results-web-part-to-show-birthdays.md)
57+
A common request in any intranet is to show birthdays of employees. This scenario describes how to use stock SharePoint search to show birthdays of employees in the search results.
58+
59+
60+
## [Setup Results web part to show work anniversaries](Setup-Results-web-part-to-show-work-anniversaries.md)
61+
62+
Showing the work anniversaries of employees is a common request in any intranet. This scenario describes one way to achive this using a sleight of hand trick/cheating as the search index does not contains the information we need.
63+
5564
---
5665

5766
More to come!

docs/scenarios/use-query-string-in-url.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,16 @@ You can use the default configuration.
3030
There are two options available to use the Query String parameter from the URL. You only need one of the options.
3131

3232
### Option 1
33+
3334
#### Configure Web Part Connections
3435
Activate the "use input query text" connection in the existing Results Web Part. Configure "Page environment" as source, "Query string" as page environment property, "Query parameters" as query string property.
36+
3537
You will miss the "Event" Query String from the URL on this time. Add your query string to the URL manually and your query string is available in the configuration. Use the query string "Event" in the queryParameters properties drop down in the Web Part configuration.
3638

3739
As example:
38-
Full URL: https://[TENANT]/sites/[SITEURL]/SitePages/[PAGE].aspx?Event=Teams Nation&Mode=Edit
39-
Query String: Event=
40-
Value: Teams Nation
40+
* Full URL: `https://[TENANT]/sites/[SITEURL]/SitePages/[PAGE].aspx?Event=Teams Nation&Mode=Edit`
41+
* Query String: `Event=`
42+
* Value: `Teams Nation`
4143

4244
![configure query string parameter](assets/use-query-string-in-url/query-string-parameter.png)
4345

0 commit comments

Comments
 (0)