# LsOnline | Blog > SharePoint, Microsoft 365, Adoption, Dev… Public Ghost content for AI and LLM tooling. This file includes a bounded export of public pages first, then recent public posts. Append `.md` to any post or page URL to get the content in Markdown (for example, `/example-post.md`). ## Pages ### Contact Me URL: https://blog.lsonline.fr/contact-me/ Last updated: 2018-12-16T17:24:00.000Z Send ### LsOnline Terms Of Use URL: https://blog.lsonline.fr/terms/ Last updated: 2024-10-02T00:35:48.000Z ## Welcome to LsOnline These terms and conditions outline the rules and regulations for the use of LsOnline's Website. By accessing this website we assume you accept these terms and conditions in full. Do not continue to use LsOnline's website if you do not accept all of the terms and conditions stated on this page. The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and any or all Agreements: "Client", "You" and "Your" refers to you, the person accessing this website and accepting the Company's terms and conditions. "The Company", "Ourselves", "We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves, or either the Client or ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner, whether by formal meetings of a fixed duration, or any other means, for the express purpose of meeting the Client's needs in respect of provision of the Company's stated services/products, in accordance with and subject to, prevailing law of . Any use of the above terminology or other words in the singular, plural, capitalisation and/or he/she or they, are taken as interchangeable and therefore as referring to same. ## Cookies We employ the use of cookies. By using LsOnline's website you consent to the use of cookies in accordance with LsOnline's privacy policy. Most of the modern day interactive web sites use cookies to enable us to retrieve user details for each visit. Cookies are used in some areas of our site to enable the functionality of this area and ease of use for those people visiting. Some of our affiliate / advertising partners may also use cookies. ## License Unless otherwise stated, LsOnline and/or it's licensors own the intellectual property rights for all material on LsOnline. All intellectual property rights are reserved. You may view and/or print pages from / for your own personal use subject to restrictions set in these terms and conditions. You must not: 1. Republish material from / 2. Sell, rent or sub-license material from / 3. Reproduce, duplicate or copy material from / Redistribute content from LsOnline (unless content is specifically made for redistribution). ## User Comments 1. This Agreement shall begin on the date hereof. 2. Certain parts of this website offer the opportunity for users to post and exchange opinions, information, material and data ('Comments') in areas of the website. LsOnline does not screen, edit, publish or review Comments prior to their appearance on the website and Comments do not reflect the views or opinions ofLsOnline, its agents or affiliates. Comments reflect the view and opinion of the person who posts such view or opinion. To the extent permitted by applicable laws LsOnlineshall not be responsible or liable for the Comments or for any loss cost, liability, damages or expenses caused and or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website. 3. LsOnlinereserves the right to monitor all Comments and to remove any Comments which it considers in its absolute discretion to be inappropriate, offensive or otherwise in breach of these Terms and Conditions. 4. You warrant and represent that: 5. You are entitled to post the Comments on our website and have all necessary licenses and consents to do so; 6. The Comments do not infringe any intellectual property right, including without limitation copyright, patent or trademark, or other proprietary right of any third party; 7. The Comments do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material or material which is an invasion of privacy 8. The Comments will not be used to solicit or promote business or custom or present commercial activities or unlawful activity. 9. You hereby grant to **LsOnline** a non-exclusive royalty-free license to use, reproduce, edit and authorize others to use, reproduce and edit any of your Comments in any and all forms, formats or media. ## Hyperlinking to our Content 1. The following organizations may link to our Web site without prior written approval: 2. Government agencies; 3. Search engines; 4. News organizations; 5. Online directory distributors when they list us in the directory may link to our Web site in the same manner as they hyperlink to the Web sites of other listed businesses; and 6. Systemwide Accredited Businesses except soliciting non-profit organizations, charity shopping malls, and charity fundraising groups which may not hyperlink to our Web site. 7. These organizations may link to our home page, to publications or to other Web site information so long as the link: (a) is not in any way misleading; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products or services; and (c) fits within the context of the linking party's site. 8. We may consider and approve in our sole discretion other link requests from the following types of organizations: 9. commonly-known consumer and/or business information sources such as Chambers of Commerce, American Automobile Association, AARP and Consumers Union; 10. dot.com community sites; 11. associations or other groups representing charities, including charity giving sites, 12. online directory distributors; 13. internet portals; 14. accounting, law and consulting firms whose primary clients are businesses; and 15. educational institutions and trade associations. We will approve link requests from these organizations if we determine that: (a) the link would not reflect unfavorably on us or our accredited businesses (for example, trade associations or other organizations representing inherently suspect types of business, such as work-at-home opportunities, shall not be allowed to link); (b)the organization does not have an unsatisfactory record with us; (c) the benefit to us from the visibility associated with the hyperlink outweighs the absence of LsOnline; and (d) where the link is in the context of general resource information or is otherwise consistent with editorial content in a newsletter or similar product furthering the mission of the organization. These organizations may link to our home page, to publications or to other Web site information so long as the link: (a) is not in any way misleading; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and it products or services; and (c) fits within the context of the linking party's site. If you are among the organizations listed in paragraph 2 above and are interested in linking to our website, you must notify us by sending an e-mail to [blog@lsonline.fr](mailto:blog@lsonline.fr "send an email to blog@lsonline.fr"). Please include your name, your organization name, contact information (such as a phone number and/or e-mail address) as well as the URL of your site, a list of any URLs from which you intend to link to our Web site, and a list of the URL(s) on our site to which you would like to link. Allow 2-3 weeks for a response. Approved organizations may hyperlink to our Web site as follows: 1. By use of our corporate name; or 2. By use of the uniform resource locator (Web address) being linked to; or 3. By use of any other description of our Web site or material being linked to that makes sense within the context and format of content on the linking party's site. No use of LsOnline's logo or other artwork will be allowed for linking absent a trademark license agreement. ## Iframes Without prior approval and express written permission, you may not create frames around our Web pages or use other techniques that alter in any way the visual presentation or appearance of our Web site. ## Reservation of Rights We reserve the right at any time and in its sole discretion to request that you remove all links or any particular link to our Web site. You agree to immediately remove all links to our Web site upon such request. We also reserve the right to amend these terms and conditions and its linking policy at any time. By continuing to link to our Web site, you agree to be bound to and abide by these linking terms and conditions. ## Removal of links from our website If you find any link on our Web site or any linked web site objectionable for any reason, you may contact us about this. We will consider requests to remove links but will have no obligation to do so or to respond directly to you. Whilst we endeavour to ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we commit to ensuring that the website remains available or that the material on the website is kept up to date. ## Content Liability We shall have no responsibility or liability for any content appearing on your Web site. You agree to indemnify and defend us against all claims arising out of or based upon your Website. No link(s) may appear on any page on your Web site or within any context containing content or materials that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights. ## Disclaimer To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website (including, without limitation, any warranties implied by law in respect of satisfactory quality, fitness for purpose and/or the use of reasonable care and skill). Nothing in this disclaimer will: 1. limit or exclude our or your liability for death or personal injury resulting from negligence; 2. limit or exclude our or your liability for fraud or fraudulent misrepresentation; 3. limit any of our or your liabilities in any way that is not permitted under applicable law; or 4. exclude any of our or your liabilities that may not be excluded under applicable law. The limitations and exclusions of liability set out in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer or in relation to the subject matter of this disclaimer, including liabilities arising in contract, in tort (including negligence) and for breach of statutory duty. To the extent that the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature. ## Credit & Contact Information This Terms and conditions page was created at [privacytermsgenerator.com](https://privacytermsgenerator.com/?ref=blog.lsonline.fr) generator. If you have any queries regarding any of our terms, please contact us. ### LsOnline Privacy Policy URL: https://blog.lsonline.fr/privacy-policy/ Last updated: 2024-10-02T00:36:19.000Z ## Your privacy is critically important to us. It is LsOnline's policy to respect your privacy regarding any information we may collect while operating our website. This Privacy Policy applies to [https://blog.lsonline.fr](http://fluent-ui.local/?ref=blog.lsonline.fr) (hereinafter, "us", "we", or "[https://blog.lsonline.fr](https://blog.lsonline.fr/)"). We respect your privacy and are committed to protecting personally identifiable information you may provide us through the Website. We have adopted this privacy policy ("Privacy Policy") to explain what information may be collected on our Website, how we use this information, and under what circumstances we may disclose the information to third parties. This Privacy Policy applies only to information we collect through the Website and does not apply to our collection of information from other sources. This Privacy Policy, together with the Terms and conditions posted on our Website, set forth the general rules and policies governing your use of our Website. Depending on your activities when visiting our Website, you may be required to agree to additional terms and conditions. ## Website Visitors Like most website operators, LsOnline collects non-personally-identifying information of the sort that web browsers and servers typically make available, such as the browser type, language preference, referring site, and the date and time of each visitor request. LsOnline's purpose in collecting non-personally identifying information is to better understand how LsOnline's visitors use its website. From time to time, LsOnline may release non-personally-identifying information in the aggregate, e.g., by publishing a report on trends in the usage of its website. LsOnline also collects potentially personally-identifying information like Internet Protocol (IP) addresses for logged in users and for users leaving comments on / blog posts. LsOnline only discloses logged in user and commenter IP addresses under the same circumstances that it uses and discloses personally-identifying information as described below. ## Gathering of Personally-Identifying Information Certain visitors to LsOnline's websites choose to interact with LsOnline in ways that require LsOnline to gather personally-identifying information. The amount and type of information that LsOnline gathers depends on the nature of the interaction. For example, we ask visitors who sign up for a blog at / to provide a username and email address. ## Security The security of your Personal Information is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Information, we cannot guarantee its absolute security. ## Advertisements Ads appearing on our website may be delivered to users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This Privacy Policy covers the use of cookies by LsOnline and does not cover the use of cookies by any advertisers. ## Links To External Sites Our Service may contain links to external sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy and terms and conditions of every site you visit. We have no control over, and assume no responsibility for the content, privacy policies or practices of any third party sites, products or services. ## Aggregated Statistics LsOnline may collect statistics about the behavior of visitors to its website. LsOnline may display this information publicly or provide it to others. However, LsOnline does not disclose your personally-identifying information. ## Cookies To enrich and perfect your online experience, LsOnline uses "Cookies", similar technologies and services provided by others to display personalized content, appropriate advertising and store your preferences on your computer. A cookie is a string of information that a website stores on a visitor's computer, and that the visitor's browser provides to the website each time the visitor returns. LsOnline uses cookies to help LsOnline identify and track visitors, their usage of /, and their website access preferences. LsOnline visitors who do not wish to have cookies placed on their computers should set their browsers to refuse cookies before using LsOnline's websites, with the drawback that certain features of LsOnline's websites may not function properly without the aid of cookies. By continuing to navigate our website without changing your cookie settings, you hereby acknowledge and agree to LsOnline's use of cookies. ## Privacy Policy Changes Although most changes are likely to be minor, LsOnline may change its Privacy Policy from time to time, and in LsOnline's sole discretion. LsOnline encourages visitors to frequently check this page for any changes to its Privacy Policy. Your continued use of this site after any change in this Privacy Policy will constitute your acceptance of such change. ## Credit & Contact Information This privacy policy was created at [termsandconditionstemplate.com](https://termsandconditionstemplate.com/privacy-policy-generator/?ref=blog.lsonline.fr "Privacy policy template generator"). If you have any questions about this Privacy Policy, please contact us via [email](mailto:blog@lsonline.fr). ### Videos URL: https://blog.lsonline.fr/videos/ Last updated: 2021-05-06T00:25:30.000Z ## ![](https://blog.lsonline.fr/content/images/2021/05/flag-en.png) Introduction to Matomo Analytics for SharePoint - 2019/05/20 Video recorded at 2019/05/20 during a PnP Community call --- ## ![](https://blog.lsonline.fr/content/images/2021/05/flag-fr.png) SPFx Tips and Tricks Video recorded during the Microsoft 365 Developer Bootcamp 2020 @Montreal at 2020/11/19 ### All tags URL: https://blog.lsonline.fr/tags/ Last updated: 2021-01-09T02:51:39.000Z _No content available._ ### Events URL: https://blog.lsonline.fr/events/ Last updated: 2021-01-09T02:52:51.000Z _No content available._ ### Featured Posts URL: https://blog.lsonline.fr/featured/ Last updated: 2021-01-09T02:53:27.000Z _No content available._ ### Style Guide URL: https://blog.lsonline.fr/style-guide/ Last updated: 2026-06-20T21:38:27.000Z ## H2 Heading Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Rhoncus [urna neque](https://iveel.co/?ref=blog.lsonline.fr) viverra justo nec ultrices. Congue nisi vitae suscipit tellus. Massa tincidunt dui ut ornare lectus sit amet est placerat. Amet risus nullam eget felis eget nunc. ## Bookmark Card In hac habitasse platea dictumst vestibulum rhoncus. Sed odio morbi quis commodo odio aenean sed. Dictum non consectetur a erat nam at lectus urna duis. [Ghost Handlebars Themes - Ghost Developer DocsThe Ghost theme layer has been engineered to give developers and designers the flexibility to build custom publications that are powered by the Ghost platform.![](https://static.ghost.org/v5.0.0/images/link-icon.svg)Ghost Developer Docs![](https://blog.lsonline.fr/content/images/thumbnail/image)](https://ghost.org/docs/api/v3/handlebars-themes/?ref=blog.lsonline.fr) ## Images Consequat interdum varius sit amet mattis vulputate enim. Accumsan sit amet nulla facilisi. Auctor neque vitae tempus quam pellentesque nec nam. In aliquam **sem fringilla** ut morbi tincidunt. Vitae proin sagittis nisl *rhoncus* *mattis* rhoncus urna neque. In vitae turpis massa sed. ### Gifs Tape `/gif` and **Enter** ![](https://media.tenor.com/images/6717d386db9c524f6bb733cd9cca65e3/tenor.gif) ### Wide ![Rolling fields](https://images.unsplash.com/photo-1463437425560-dc2babb404e4?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjExNzczfQ) Photo by [Jaime Spaniol](https://unsplash.com/@jaimespaniol?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) ### Regular ![](https://blog.lsonline.fr/content/images/2022/03/testimg1.jpeg) Proin nibh nisl condimentum id venenatis. Pretium lectus quam id leo in vitae turpis massa. Nisl pretium fusce id velit ut tortor pretium. Volutpat ac tincidunt vitae semper quis. Purus in mollis nunc sed id semper risus in hendrerit. In hac habitasse platea dictumst vestibulum rhoncus. Sed odio morbi quis commodo odio aenean sed. Dictum non consectetur a erat nam at lectus urna duis. ![](https://alto.ghost.io/content/images/2019/04/baptist-standaert-333489-unsplash.jpg) A full-width image with a caption ? --- Lorem dolor sed viverra ipsum. Vitae tortor condimentum lacinia quis vel eros. Elementum facilisis leo vel fringilla. Quis eleifend quam adipiscing vitae proin sagittis. Porttitor massa id neque aliquam. In pellentesque massa placerat duis ultricies lacus sed. Nulla porttitor massa id neque aliquam vestibulum morbi. Egestas sed tempus urna et pharetra pharetra. ### Gallery Images ![](https://alto.ghost.io/content/images/2019/04/linford-miles-285635-unsplash.jpg) ![](https://alto.ghost.io/content/images/2019/04/jeremy-bishop-1053803-unsplash.jpg) ![](https://alto.ghost.io/content/images/2019/04/jose-llamas-734523-unsplash.jpg) ![](https://alto.ghost.io/content/images/2019/04/milo-mcdowell-3027-unsplash.jpg) Empty spaces are filled with images automatically. It just works! Diam sollicitudin tempor id eu nisl nunc. Nullam eget felis eget nunc lobortis mattis aliquam. Mauris vitae ultricies leo integer malesuada nunc vel. Et molestie ac feugiat sed lectus vestibulum mattis ullamcorper velit. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Posuere lorem ipsum dolor sit amet consectetur. Potenti nullam ac tortor vitae purus faucibus. Eget sit amet tellus cras adipiscing enim eu turpis. Eget sit amet tellus cras adipiscing enim eu turpis egestas. Faucibus turpis in eu mi bibendum neque egestas congue. ## Lists ### Unordored - Euismod elementum nisi - Quis eleifend quam adipiscing - Vitae proin sagittis - Nibh sit amet commodo ### Ordered 1. Euismod elementum nisi 2. Quis eleifend quam adipiscing 3. Vitae proin sagittis 4. Nibh sit amet commodo Dictum varius duis at consectetur. Quam quisque id diam vel quam elementum pulvinar etiam non. Sagittis nisl rhoncus mattis rhoncus urna. Tincidunt id aliquet risus feugiat in ante metus. In dictum non consectetur. Euismod quis viverra nibh cras. Morbi enim nunc faucibus a pellentesque sit. Ac auctor augue mauris augue neque gravida in fermentum et. Amet consectetur adipiscing elit duis tristique. Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. ## Toggle #### Toggle Header Lorem ipsum dolor sit amet, [test link](https://demo.ghost.io/style-test/?ref=blog.lsonline.fr) adipiscing elit. ****This is strong.** Nullam dignissim convallis est. Quisque aliquam. **This is emphasized.* Donec faucibus. Nunc iaculis suscipit dui. 53 \= 125\. Water is H2O. Nam sit amet sem. Aliquam libero nisi, imperdiet at, tincidunt nec, gravida vehicula, nisl. The New York Times (That’s a citation). Underline. Maecenas ornare tortor. Donec sed tellus eget sapien fringilla nonummy. Mauris a ante. Suspendisse quam sem, consequat at, commodo vitae, feugiat in, nunc. Morbi imperdiet augue quis tellus. ## Cards ### Button [Button text](#) ### Callout πŸ—£οΈ Callout text... ### Header ## Heading Text ### Subheading text [ Button text ](#) ### Video 0:00 /0:05 1Γ— ### Audio Pack1 ElectricGuitar Mood 1 F Minor 85BPM 0:00 /14.117646 1Γ— ### Product ![](https://blog.lsonline.fr/content/images/2022/03/ghost-product.jpeg) #### Product title Description [Buttin text](#) ## Alerts ```markdown > ... > [note] Note > ... > [info] Important > ... > [success] Tip > ... > [warning] Warning > ... > [danger] Error > ... ``` > Default alert > \[note\]Note > > Note alert > \[info\]Important > > Important / info alert > \[success\]Tip > > Success / tip alert > \[warning\]Warning > > Warning alert > \[danger\]Error > > Danger alert ## Code highlight The [Highlight.js](https://highlightjs.org/?ref=blog.lsonline.fr) Framework is used to highlight snippet code parts into posts and pages directly. An additional script allows adding the header that displays the code language and a **Copy** button ```PowerShell Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/project -Credential $userCreds ``` ```JavaScript function sayHello(name) { return 'Hello World !! By ' + name; } console.log(sayHello('Fluent UI')); ``` A simple JavaScript function that says Hello Basically, the `inline code` is supported as well: ```Markdown You can highlight `inline code` like this ``` In addition to the code highlight, the theme supports the keyboard actions such as CMD \+ C ```HTML C ``` ## Fluent UI Styles - [Typography](https://blog.lsonline.fr/fluent-ui-core-typography) - [Color](https://blog.lsonline.fr/fluent-ui-core-color) - [Buttons](https://blog.lsonline.fr/fluent-ui-core-buttons) - [Icons](https://blog.lsonline.fr/fluent-ui-core-icons) - [Layouts](https://blog.lsonline.fr/fluent-ui-core-responsive-grid) ### Fluent UI Core - Icons URL: https://blog.lsonline.fr/fluent-ui-core-icons/ Last updated: 2026-06-21T01:26:40.000Z [Back to Style Guide page](https://blog.lsonline.fr/style-guide/ "Back to Guide Style page") Fabric uses a custom font for its iconography. This font contains glyphs that you can scale, color, and style in any way. You can even flip them for right-to-left localization. To use the icons, combine the base ms-Icon class with a modifier class for the specific icon. ```HTML ``` Note the `aria-hidden` attribute, which prevents screen readers from reading the icon. In cases where meaning is conveyed only through the icon, such as an icon-only navigation bar, be sure to apply an aria-label to the button for accessibility. --- - ms-Icon--12PointStar - ms-Icon--6PointStar - ms-Icon--AADLogo - ms-Icon--Accept - ms-Icon--AccessibiltyChecker - ms-Icon--AccessLogo - ms-Icon--AccessLogoFill - ms-Icon--AccountActivity - ms-Icon--AccountBrowser - ms-Icon--AccountManagement - ms-Icon--Accounts - ms-Icon--ActionCenter - ms-Icon--ActivateOrders - ms-Icon--ActivityFeed - ms-Icon--Add - ms-Icon--AddBookmark - ms-Icon--AddEvent - ms-Icon--AddFavorite - ms-Icon--AddFavoriteFill - ms-Icon--AddFriend - ms-Icon--AddGroup - ms-Icon--AddHome - ms-Icon--AddIn - ms-Icon--AddLink - ms-Icon--AddNotes - ms-Icon--AddOnlineMeeting - ms-Icon--AddPhone - ms-Icon--AddReaction - ms-Icon--AddTo - ms-Icon--AddToShoppingList - ms-Icon--AddWork - ms-Icon--Admin - ms-Icon--AdminALogo32 - ms-Icon--AdminALogoFill32 - ms-Icon--AdminALogoInverse32 - ms-Icon--AdminCLogoInverse32 - ms-Icon--AdminDLogoInverse32 - ms-Icon--AdminELogoInverse32 - ms-Icon--AdminLLogoInverse32 - ms-Icon--AdminMLogoInverse32 - ms-Icon--AdminOLogoInverse32 - ms-Icon--AdminPLogoInverse32 - ms-Icon--AdminSLogoInverse32 - ms-Icon--AdminYLogoInverse32 - ms-Icon--Airplane - ms-Icon--AirplaneSolid - ms-Icon--AirTickets - ms-Icon--AlarmClock - ms-Icon--Album - ms-Icon--AlbumRemove - ms-Icon--AlertSettings - ms-Icon--AlertSolid - ms-Icon--AlignCenter - ms-Icon--AlignHorizontalCenter - ms-Icon--AlignHorizontalLeft - ms-Icon--AlignHorizontalRight - ms-Icon--AlignJustify - ms-Icon--AlignLeft - ms-Icon--AlignRight - ms-Icon--AlignVerticalBottom - ms-Icon--AlignVerticalCenter - ms-Icon--AlignVerticalTop - ms-Icon--AllApps - ms-Icon--AllAppsMirrored - ms-Icon--AllCurrency - ms-Icon--AnalyticsLogo - ms-Icon--AnalyticsQuery - ms-Icon--AnalyticsReport - ms-Icon--AnalyticsView - ms-Icon--AnchorLock - ms-Icon--Annotation - ms-Icon--AppIconDefault - ms-Icon--AppIconDefaultAdd - ms-Icon--AppIconDefaultList - ms-Icon--Archive - ms-Icon--AreaChart - ms-Icon--ArrangeBringForward - ms-Icon--ArrangeBringToFront - ms-Icon--ArrangeByFrom - ms-Icon--ArrangeSendBackward - ms-Icon--ArrangeSendToBack - ms-Icon--Arrivals - ms-Icon--ArrowDownRight8 - ms-Icon--ArrowDownRightMirrored8 - ms-Icon--ArrowTallDownLeft - ms-Icon--ArrowTallDownRight - ms-Icon--ArrowTallUpLeft - ms-Icon--ArrowTallUpRight - ms-Icon--ArrowUpRight - ms-Icon--ArrowUpRight8 - ms-Icon--ArrowUpRightMirrored8 - ms-Icon--Articles - ms-Icon--Ascending - ms-Icon--AspectRatio - ms-Icon--AssessmentGroup - ms-Icon--AssessmentGroupTemplate - ms-Icon--AssetLibrary - ms-Icon--Assign - ms-Icon--Asterisk - ms-Icon--AsteriskSolid - ms-Icon--ATPLogo - ms-Icon--Attach - ms-Icon--AustralianRules - ms-Icon--AuthenticatorApp - ms-Icon--AutoEnhanceOff - ms-Icon--AutoEnhanceOn - ms-Icon--AutoFillTemplate - ms-Icon--AutoHeight - ms-Icon--AutoRacing - ms-Icon--AwayStatus - ms-Icon--AzureAPIManagement - ms-Icon--AzureKeyVault - ms-Icon--AzureLogo - ms-Icon--AzureServiceEndpoint - ms-Icon--Back - ms-Icon--BackgroundColor - ms-Icon--Backlog - ms-Icon--BacklogBoard - ms-Icon--BacklogList - ms-Icon--BackToWindow - ms-Icon--Badge - ms-Icon--Balloons - ms-Icon--Bank - ms-Icon--BankSolid - ms-Icon--BarChart4 - ms-Icon--BarChartHorizontal - ms-Icon--BarChartVertical - ms-Icon--BarChartVerticalEdit - ms-Icon--BarChartVerticalFill - ms-Icon--BarChartVerticalFilter - ms-Icon--BarChartVerticalFilterSolid - ms-Icon--Baseball - ms-Icon--BeerMug - ms-Icon--BIDashboard - ms-Icon--BidiLtr - ms-Icon--BidiRtl - ms-Icon--BingLogo - ms-Icon--BirthdayCake - ms-Icon--BlockContact - ms-Icon--Blocked - ms-Icon--Blocked12 - ms-Icon--Blocked2 - ms-Icon--Blocked2Solid - ms-Icon--BlockedSite - ms-Icon--BlockedSiteSolid12 - ms-Icon--BlockedSolid - ms-Icon--Blog - ms-Icon--BlowingSnow - ms-Icon--Blur - ms-Icon--Boards - ms-Icon--Bold - ms-Icon--BookAnswers - ms-Icon--BookingsLogo - ms-Icon--BookmarkReport - ms-Icon--Bookmarks - ms-Icon--BookmarksMirrored - ms-Icon--BorderDash - ms-Icon--BorderDot - ms-Icon--BoxAdditionSolid - ms-Icon--BoxCheckmarkSolid - ms-Icon--BoxMultiplySolid - ms-Icon--BoxPlaySolid - ms-Icon--BoxSubtractSolid - ms-Icon--BranchCommit - ms-Icon--BranchCompare - ms-Icon--BranchFork - ms-Icon--BranchFork2 - ms-Icon--BranchLocked - ms-Icon--BranchMerge - ms-Icon--BranchPullRequest - ms-Icon--BranchSearch - ms-Icon--BranchShelveset - ms-Icon--Breadcrumb - ms-Icon--Breakfast - ms-Icon--Brightness - ms-Icon--Broom - ms-Icon--BrowserScreenShot - ms-Icon--BrowserTab - ms-Icon--BrowserTabScreenshot - ms-Icon--Brunch - ms-Icon--Brush - ms-Icon--BucketColor - ms-Icon--BucketColorFill - ms-Icon--BufferTimeAfter - ms-Icon--BufferTimeBefore - ms-Icon--BufferTimeBoth - ms-Icon--Bug - ms-Icon--BugSolid - ms-Icon--Build - ms-Icon--BuildDefinition - ms-Icon--BuildIssue - ms-Icon--BuildQueue - ms-Icon--BuildQueueNew - ms-Icon--BulkUpload - ms-Icon--BulletedList - ms-Icon--BulletedList2 - ms-Icon--BulletedList2Mirrored - ms-Icon--BulletedListBullet - ms-Icon--BulletedListBulletMirrored - ms-Icon--BulletedListMirrored - ms-Icon--BulletedListText - ms-Icon--BulletedListTextMirrored - ms-Icon--BulletedTreeList - ms-Icon--Bullseye - ms-Icon--BullseyeTarget - ms-Icon--BullseyeTargetEdit - ms-Icon--Bus - ms-Icon--BusinessCenterLogo - ms-Icon--BusinessHoursSign - ms-Icon--BusSolid - ms-Icon--ButtonControl - ms-Icon--Cafe - ms-Icon--Cake - ms-Icon--Calculator - ms-Icon--CalculatorAddition - ms-Icon--CalculatorEqualTo - ms-Icon--CalculatorMultiply - ms-Icon--CalculatorNotEqualTo - ms-Icon--CalculatorPercentage - ms-Icon--CalculatorSubtract - ms-Icon--Calendar - ms-Icon--CalendarAgenda - ms-Icon--CalendarDay - ms-Icon--CalendarMirrored - ms-Icon--CalendarReply - ms-Icon--CalendarSettings - ms-Icon--CalendarSettingsMirrored - ms-Icon--CalendarWeek - ms-Icon--CalendarWorkWeek - ms-Icon--CalendarYear - ms-Icon--Calories - ms-Icon--CaloriesAdd - ms-Icon--Camera - ms-Icon--CampaignTemplate - ms-Icon--Cancel - ms-Icon--CannedChat - ms-Icon--Car - ms-Icon--CaretBottomLeftCenter8 - ms-Icon--CaretBottomLeftSolid8 - ms-Icon--CaretBottomRightCenter8 - ms-Icon--CaretBottomRightSolid8 - ms-Icon--CaretDown8 - ms-Icon--CaretDownSolid8 - ms-Icon--CaretHollow - ms-Icon--CaretHollowMirrored - ms-Icon--CaretLeft8 - ms-Icon--CaretLeftSolid8 - ms-Icon--CaretRight - ms-Icon--CaretRight8 - ms-Icon--CaretRightSolid8 - ms-Icon--CaretSolid - ms-Icon--CaretSolid16 - ms-Icon--CaretSolidDown - ms-Icon--CaretSolidLeft - ms-Icon--CaretSolidMirrored - ms-Icon--CaretSolidRight - ms-Icon--CaretSolidUp - ms-Icon--CaretTopLeftCenter8 - ms-Icon--CaretTopLeftSolid8 - ms-Icon--CaretTopRightCenter8 - ms-Icon--CaretTopRightSolid8 - ms-Icon--CaretUp8 - ms-Icon--CaretUpSolid8 - ms-Icon--Cat - ms-Icon--CellPhone - ms-Icon--Certificate - ms-Icon--CertifiedDatabase - ms-Icon--ChangeEntitlements - ms-Icon--Chart - ms-Icon--ChartSeries - ms-Icon--ChartTemplate - ms-Icon--ChartXAngle - ms-Icon--ChartYAngle - ms-Icon--Chat - ms-Icon--ChatBot - ms-Icon--ChatInviteFriend - ms-Icon--ChatSolid - ms-Icon--Checkbox - ms-Icon--CheckboxComposite - ms-Icon--CheckboxCompositeReversed - ms-Icon--CheckboxFill - ms-Icon--CheckboxIndeterminate - ms-Icon--CheckedOutByOther12 - ms-Icon--CheckedOutByYou12 - ms-Icon--CheckList - ms-Icon--CheckListCheck - ms-Icon--CheckListCheckMirrored - ms-Icon--CheckListText - ms-Icon--CheckListTextMirrored - ms-Icon--CheckMark - ms-Icon--ChevronDown - ms-Icon--ChevronDownEnd6 - ms-Icon--ChevronDownMed - ms-Icon--ChevronDownSmall - ms-Icon--ChevronFold10 - ms-Icon--ChevronLeft - ms-Icon--ChevronLeftEnd6 - ms-Icon--ChevronLeftMed - ms-Icon--ChevronLeftSmall - ms-Icon--ChevronRight - ms-Icon--ChevronRightEnd6 - ms-Icon--ChevronRightMed - ms-Icon--ChevronRightSmall - ms-Icon--ChevronUnfold10 - ms-Icon--ChevronUp - ms-Icon--ChevronUpEnd6 - ms-Icon--ChevronUpMed - ms-Icon--ChevronUpSmall - ms-Icon--Childof - ms-Icon--Chopsticks - ms-Icon--ChromeBack - ms-Icon--ChromeBackMirrored - ms-Icon--ChromeClose - ms-Icon--ChromeFullScreen - ms-Icon--ChromeMinimize - ms-Icon--ChromeRestore - ms-Icon--CircleAddition - ms-Icon--CircleAdditionSolid - ms-Icon--CircleFill - ms-Icon--CircleHalfFull - ms-Icon--CirclePause - ms-Icon--CirclePauseSolid - ms-Icon--CirclePlus - ms-Icon--CircleRing - ms-Icon--CircleShapeSolid - ms-Icon--CircleStop - ms-Icon--CircleStopSolid - ms-Icon--CityNext - ms-Icon--CityNext2 - ms-Icon--ClassNotebookLogo16 - ms-Icon--ClassNotebookLogo32 - ms-Icon--ClassNotebookLogoFill16 - ms-Icon--ClassNotebookLogoFill32 - ms-Icon--ClassNotebookLogoInverse - ms-Icon--ClassNotebookLogoInverse16 - ms-Icon--ClassNotebookLogoInverse32 - ms-Icon--ClassroomLogo - ms-Icon--Clear - ms-Icon--ClearFilter - ms-Icon--ClearFormatting - ms-Icon--ClearFormattingA - ms-Icon--ClearFormattingEraser - ms-Icon--ClearNight - ms-Icon--ClearSelection - ms-Icon--ClearSelectionMirrored - ms-Icon--ClipboardList - ms-Icon--ClipboardListMirrored - ms-Icon--ClipboardSolid - ms-Icon--Clock - ms-Icon--CloneToDesktop - ms-Icon--ClosedCaption - ms-Icon--ClosePane - ms-Icon--ClosePaneMirrored - ms-Icon--Cloud - ms-Icon--CloudAdd - ms-Icon--CloudDownload - ms-Icon--CloudImportExport - ms-Icon--CloudUpload - ms-Icon--CloudWeather - ms-Icon--Cloudy - ms-Icon--Cocktails - ms-Icon--Code - ms-Icon--CodeEdit - ms-Icon--Coffee - ms-Icon--CoffeeScript - ms-Icon--CollapseContent - ms-Icon--CollapseContentSingle - ms-Icon--CollapseMenu - ms-Icon--CollegeFootball - ms-Icon--CollegeHoops - ms-Icon--Color - ms-Icon--ColorSolid - ms-Icon--ColumnLeftTwoThirds - ms-Icon--ColumnLeftTwoThirdsEdit - ms-Icon--ColumnOptions - ms-Icon--ColumnRightTwoThirds - ms-Icon--ColumnRightTwoThirdsEdit - ms-Icon--ColumnVerticalSection - ms-Icon--ColumnVerticalSectionEdit - ms-Icon--Combine - ms-Icon--Combobox - ms-Icon--CommandPrompt - ms-Icon--Comment - ms-Icon--CommentActive - ms-Icon--CommentAdd - ms-Icon--CommentNext - ms-Icon--CommentPrevious - ms-Icon--CommentSolid - ms-Icon--CommentUrgent - ms-Icon--Commitments - ms-Icon--Communications - ms-Icon--CompanyDirectory - ms-Icon--CompanyDirectoryMirrored - ms-Icon--Compare - ms-Icon--CompassNW - ms-Icon--Completed - ms-Icon--CompletedSolid - ms-Icon--ComplianceAudit - ms-Icon--ConfigurationSolid - ms-Icon--ConnectContacts - ms-Icon--ConnectVirtualMachine - ms-Icon--ConstructionCone - ms-Icon--ConstructionConeSolid - ms-Icon--Contact - ms-Icon--ContactCard - ms-Icon--ContactCardSettings - ms-Icon--ContactCardSettingsMirrored - ms-Icon--ContactHeart - ms-Icon--ContactInfo - ms-Icon--ContactLink - ms-Icon--ContactList - ms-Icon--ContextMenu - ms-Icon--Contrast - ms-Icon--Copy - ms-Icon--Cotton - ms-Icon--Coupon - ms-Icon--CPlusPlus - ms-Icon--CPlusPlusLanguage - ms-Icon--CreateMailRule - ms-Icon--Cricket - ms-Icon--CRMCustomerInsightsApp - ms-Icon--CRMProcesses - ms-Icon--CRMReport - ms-Icon--CRMServices - ms-Icon--Crop - ms-Icon--Crown - ms-Icon--CrownSolid - ms-Icon--CSharp - ms-Icon--CSharpLanguage - ms-Icon--CSS - ms-Icon--CubeShape - ms-Icon--CustomizeToolbar - ms-Icon--CustomList - ms-Icon--CustomListMirrored - ms-Icon--Cut - ms-Icon--Cycling - ms-Icon--D365TalentHRCore - ms-Icon--D365TalentInsight - ms-Icon--D365TalentLearn - ms-Icon--DashboardAdd - ms-Icon--Database - ms-Icon--DatabaseSync - ms-Icon--DataConnectionLibrary - ms-Icon--Dataflows - ms-Icon--DataflowsLink - ms-Icon--DataManagementSettings - ms-Icon--DateTime - ms-Icon--DateTime2 - ms-Icon--DateTimeMirrored - ms-Icon--DeactivateOrders - ms-Icon--Decimals - ms-Icon--DecisionSolid - ms-Icon--DeclineCall - ms-Icon--DecreaseIndentArrow - ms-Icon--DecreaseIndentArrowMirrored - ms-Icon--DecreaseIndentLegacy - ms-Icon--DecreaseIndentText - ms-Icon--DecreaseIndentTextMirrored - ms-Icon--DefaultRatio - ms-Icon--DefectSolid - ms-Icon--DefenderTVM - ms-Icon--Delete - ms-Icon--DeleteColumns - ms-Icon--DeleteRows - ms-Icon--DeleteRowsMirrored - ms-Icon--DeleteTable - ms-Icon--DeliveryTruck - ms-Icon--DelveAnalytics - ms-Icon--DelveAnalyticsLogo - ms-Icon--DelveLogo - ms-Icon--DelveLogoFill - ms-Icon--DelveLogoInverse - ms-Icon--DependencyAdd - ms-Icon--DependencyRemove - ms-Icon--Deploy - ms-Icon--Descending - ms-Icon--Design - ms-Icon--DesktopScreenshot - ms-Icon--DeveloperTools - ms-Icon--Devices2 - ms-Icon--Devices3 - ms-Icon--Devices4 - ms-Icon--Diagnostic - ms-Icon--DiagnosticDataBarTooltip - ms-Icon--Dialpad - ms-Icon--Diamond - ms-Icon--DiamondSolid - ms-Icon--Dictionary - ms-Icon--DictionaryRemove - ms-Icon--DietPlanNotebook - ms-Icon--DiffInline - ms-Icon--DiffSideBySide - ms-Icon--DisableUpdates - ms-Icon--DisconnectVirtualMachine - ms-Icon--Dislike - ms-Icon--DislikeSolid - ms-Icon--DistributeDown - ms-Icon--DockLeft - ms-Icon--DockLeftMirrored - ms-Icon--DockRight - ms-Icon--DocLibrary - ms-Icon--DocsLogoInverse - ms-Icon--Document - ms-Icon--DocumentApproval - ms-Icon--Documentation - ms-Icon--DocumentManagement - ms-Icon--DocumentReply - ms-Icon--DocumentSearch - ms-Icon--DocumentSet - ms-Icon--DOM - ms-Icon--DonutChart - ms-Icon--Door - ms-Icon--DoubleBookmark - ms-Icon--DoubleChevronDown - ms-Icon--DoubleChevronDown12 - ms-Icon--DoubleChevronDown8 - ms-Icon--DoubleChevronLeft - ms-Icon--DoubleChevronLeft12 - ms-Icon--DoubleChevronLeft8 - ms-Icon--DoubleChevronLeftMed - ms-Icon--DoubleChevronLeftMedMirrored - ms-Icon--DoubleChevronRight - ms-Icon--DoubleChevronRight12 - ms-Icon--DoubleChevronRight8 - ms-Icon--DoubleChevronUp - ms-Icon--DoubleChevronUp12 - ms-Icon--DoubleChevronUp8 - ms-Icon--DoubleColumn - ms-Icon--DoubleColumnEdit - ms-Icon--DoubleDownArrow - ms-Icon--Down - ms-Icon--Download - ms-Icon--DownloadDocument - ms-Icon--DragObject - ms-Icon--DrillDown - ms-Icon--DrillDownSolid - ms-Icon--DrillExpand - ms-Icon--DrillShow - ms-Icon--DrillThrough - ms-Icon--DRM - ms-Icon--Drop - ms-Icon--Dropdown - ms-Icon--DropShapeSolid - ms-Icon--DuplicateRow - ms-Icon--Duststorm - ms-Icon--Dynamics365Logo - ms-Icon--DynamicSMBLogo - ms-Icon--EaseOfAccess - ms-Icon--EatDrink - ms-Icon--EdgeLogo - ms-Icon--eDiscovery - ms-Icon--Edit - ms-Icon--EditContact - ms-Icon--EditCreate - ms-Icon--EditMail - ms-Icon--EditMirrored - ms-Icon--EditNote - ms-Icon--EditPhoto - ms-Icon--EditSolid12 - ms-Icon--EditSolidMirrored12 - ms-Icon--EditStyle - ms-Icon--Education - ms-Icon--Ellipse - ms-Icon--Embed - ms-Icon--EMI - ms-Icon--Emoji - ms-Icon--Emoji2 - ms-Icon--EmojiDisappointed - ms-Icon--EmojiNeutral - ms-Icon--EmojiTabSymbols - ms-Icon--EmptyRecycleBin - ms-Icon--Encryption - ms-Icon--EngineeringGroup - ms-Icon--EntitlementPolicy - ms-Icon--EntitlementRedemption - ms-Icon--EntryDecline - ms-Icon--EntryView - ms-Icon--Equalizer - ms-Icon--EraseTool - ms-Icon--Error - ms-Icon--ErrorBadge - ms-Icon--Event - ms-Icon--Event12 - ms-Icon--EventAccepted - ms-Icon--EventDate - ms-Icon--EventDateMissed12 - ms-Icon--EventDeclined - ms-Icon--EventInfo - ms-Icon--EventTentative - ms-Icon--EventTentativeMirrored - ms-Icon--EventToDoLogo - ms-Icon--ExcelDocument - ms-Icon--ExcelLogo - ms-Icon--ExcelLogo16 - ms-Icon--ExcelLogoFill - ms-Icon--ExcelLogoFill16 - ms-Icon--ExcelLogoInverse - ms-Icon--ExcelLogoInverse16 - ms-Icon--ExchangeLogo - ms-Icon--ExchangeLogoFill - ms-Icon--ExchangeLogoInverse - ms-Icon--ExerciseTracker - ms-Icon--ExpandMenu - ms-Icon--ExploreContent - ms-Icon--ExploreContentSingle - ms-Icon--ExploreData - ms-Icon--Export - ms-Icon--ExportMirrored - ms-Icon--ExternalBuild - ms-Icon--ExternalTFVC - ms-Icon--ExternalXAML - ms-Icon--Eyedropper - ms-Icon--EyeShadow - ms-Icon--F12DevTools - ms-Icon--FabricAssetLibrary - ms-Icon--FabricDataConnectionLibrary - ms-Icon--FabricDocLibrary - ms-Icon--FabricFolder - ms-Icon--FabricFolderConfirm - ms-Icon--FabricFolderFill - ms-Icon--FabricFolderSearch - ms-Icon--FabricFormLibrary - ms-Icon--FabricFormLibraryMirrored - ms-Icon--FabricMovetoFolder - ms-Icon--FabricNetworkFolder - ms-Icon--FabricNewFolder - ms-Icon--FabricOpenFolderHorizontal - ms-Icon--FabricPictureLibrary - ms-Icon--FabricPublicFolder - ms-Icon--FabricReportLibrary - ms-Icon--FabricReportLibraryMirrored - ms-Icon--FabricSyncFolder - ms-Icon--FabricTextHighlight - ms-Icon--FabricTextHighlightComposite - ms-Icon--FabricUnsyncFolder - ms-Icon--FabricUserFolder - ms-Icon--Family - ms-Icon--FangBody - ms-Icon--FastForward - ms-Icon--FastMode - ms-Icon--Favicon - ms-Icon--FavoriteList - ms-Icon--FavoriteStar - ms-Icon--FavoriteStarFill - ms-Icon--Fax - ms-Icon--Feedback - ms-Icon--FeedbackRequestMirroredSolid - ms-Icon--FeedbackRequestSolid - ms-Icon--FeedbackResponseSolid - ms-Icon--Ferry - ms-Icon--FerrySolid - ms-Icon--FieldChanged - ms-Icon--FieldEmpty - ms-Icon--FieldFilled - ms-Icon--FieldNotChanged - ms-Icon--FieldReadOnly - ms-Icon--FieldRequired - ms-Icon--FileASPX - ms-Icon--FileBug - ms-Icon--FileCode - ms-Icon--FileComment - ms-Icon--FileCSS - ms-Icon--FileHTML - ms-Icon--FileImage - ms-Icon--FileJAVA - ms-Icon--FileLess - ms-Icon--FilePDB - ms-Icon--FileRequest - ms-Icon--FileSass - ms-Icon--FileSQL - ms-Icon--FileSymlink - ms-Icon--FileTemplate - ms-Icon--FileTypeSolution - ms-Icon--FileYML - ms-Icon--Filter - ms-Icon--Filters - ms-Icon--FilterSettings - ms-Icon--FilterSolid - ms-Icon--FiltersSolid - ms-Icon--Financial - ms-Icon--FinancialMirroredSolid - ms-Icon--FinancialSolid - ms-Icon--Fingerprint - ms-Icon--FitPage - ms-Icon--FitWidth - ms-Icon--FiveTileGrid - ms-Icon--Flag - ms-Icon--FlameSolid - ms-Icon--Flashlight - ms-Icon--FlickDown - ms-Icon--FlickLeft - ms-Icon--FlickRight - ms-Icon--FlickUp - ms-Icon--Flow - ms-Icon--FlowChart - ms-Icon--Flower - ms-Icon--FocalPoint - ms-Icon--Focus - ms-Icon--Fog - ms-Icon--Folder - ms-Icon--FolderFill - ms-Icon--FolderHorizontal - ms-Icon--FolderList - ms-Icon--FolderListMirrored - ms-Icon--FolderOpen - ms-Icon--FolderQuery - ms-Icon--FolderSearch - ms-Icon--FollowUser - ms-Icon--Font - ms-Icon--FontColor - ms-Icon--FontColorA - ms-Icon--FontColorSwatch - ms-Icon--FontDecrease - ms-Icon--FontIncrease - ms-Icon--FontSize - ms-Icon--Footer - ms-Icon--FormLibrary - ms-Icon--FormLibraryMirrored - ms-Icon--Forum - ms-Icon--Forward - ms-Icon--ForwardEvent - ms-Icon--Freezing - ms-Icon--Frigid - ms-Icon--FrontCamera - ms-Icon--FSharp - ms-Icon--FSharpLanguage - ms-Icon--FullCircleMask - ms-Icon--FullHistory - ms-Icon--FullScreen - ms-Icon--FullWidth - ms-Icon--FullWidthEdit - ms-Icon--FunctionalManagerDashboard - ms-Icon--FunnelChart - ms-Icon--GallatinLogo - ms-Icon--Game - ms-Icon--Generate - ms-Icon--GenericScan - ms-Icon--GenericScanFilled - ms-Icon--GIF - ms-Icon--Giftbox - ms-Icon--GiftboxOpen - ms-Icon--GiftBoxSolid - ms-Icon--GiftCard - ms-Icon--GitGraph - ms-Icon--Glasses - ms-Icon--Glimmer - ms-Icon--GlobalNavButton - ms-Icon--GlobalNavButtonActive - ms-Icon--Globe - ms-Icon--Globe2 - ms-Icon--GlobeFavorite - ms-Icon--Go - ms-Icon--Golf - ms-Icon--GoMirrored - ms-Icon--GoToDashboard - ms-Icon--GotoToday - ms-Icon--GreetingCard - ms-Icon--GridViewLarge - ms-Icon--GridViewMedium - ms-Icon--GridViewSmall - ms-Icon--GripperBarHorizontal - ms-Icon--GripperBarVertical - ms-Icon--GripperDotsVertical - ms-Icon--GripperTool - ms-Icon--Group - ms-Icon--GroupedAscending - ms-Icon--GroupedDescending - ms-Icon--GroupedList - ms-Icon--GroupList - ms-Icon--GroupObject - ms-Icon--GUID - ms-Icon--Guitar - ms-Icon--HailDay - ms-Icon--HailNight - ms-Icon--HalfAlpha - ms-Icon--HalfCircle - ms-Icon--HandsFree - ms-Icon--Handwriting - ms-Icon--HardDrive - ms-Icon--HardDriveGroup - ms-Icon--HardDriveLock - ms-Icon--HardDriveUnlock - ms-Icon--Header - ms-Icon--Header1 - ms-Icon--Header2 - ms-Icon--Header3 - ms-Icon--Header4 - ms-Icon--Headset - ms-Icon--HeadsetSolid - ms-Icon--Health - ms-Icon--HealthSolid - ms-Icon--Heart - ms-Icon--HeartBroken - ms-Icon--HeartFill - ms-Icon--Help - ms-Icon--HelpMirrored - ms-Icon--Hexagon - ms-Icon--Hide - ms-Icon--Hide2 - ms-Icon--Hide3 - ms-Icon--Highlight - ms-Icon--HighlightMappedShapes - ms-Icon--HintText - ms-Icon--HistoricalWeather - ms-Icon--History - ms-Icon--Home - ms-Icon--HomeGroup - ms-Icon--HomeSolid - ms-Icon--HomeVerify - ms-Icon--HorizontalDistributeCenter - ms-Icon--HorizontalTabKey - ms-Icon--Hospital - ms-Icon--Hotel - ms-Icon--HourGlass - ms-Icon--IconSetsFlag - ms-Icon--IDBadge - ms-Icon--IgnoreConversation - ms-Icon--ImageCrosshair - ms-Icon--ImageDiff - ms-Icon--ImagePixel - ms-Icon--ImageSearch - ms-Icon--Import - ms-Icon--ImportAllMirrored - ms-Icon--Important - ms-Icon--ImportMirrored - ms-Icon--Inbox - ms-Icon--InboxCheck - ms-Icon--IncidentTriangle - ms-Icon--IncomingCall - ms-Icon--IncreaseIndentArrow - ms-Icon--IncreaseIndentArrowMirrored - ms-Icon--IncreaseIndentLegacy - ms-Icon--IncreaseIndentText - ms-Icon--IncreaseIndentTextMirrored - ms-Icon--Info - ms-Icon--Info2 - ms-Icon--InformationBarriers - ms-Icon--InfoSolid - ms-Icon--InkingTool - ms-Icon--Insert - ms-Icon--InsertColumnsLeft - ms-Icon--InsertColumnsRight - ms-Icon--InsertRowsAbove - ms-Icon--InsertRowsBelow - ms-Icon--InsertSignatureLine - ms-Icon--InsertTextBox - ms-Icon--Installation - ms-Icon--InstallToDrive - ms-Icon--InternalInvestigation - ms-Icon--InternetSharing - ms-Icon--IRMForward - ms-Icon--IRMForwardMirrored - ms-Icon--IRMReply - ms-Icon--IRMReplyMirrored - ms-Icon--IssueSolid - ms-Icon--IssueTracking - ms-Icon--IssueTrackingMirrored - ms-Icon--Italic - ms-Icon--JavaScriptLanguage - ms-Icon--JoinOnlineMeeting - ms-Icon--JS - ms-Icon--KaizalaLogo - ms-Icon--KeyboardClassic - ms-Icon--KnowledgeArticle - ms-Icon--Label - ms-Icon--LadybugSolid - ms-Icon--Lamp - ms-Icon--LandscapeOrientation - ms-Icon--LaptopSecure - ms-Icon--LaptopSelected - ms-Icon--LargeGrid - ms-Icon--Leave - ms-Icon--Library - ms-Icon--Lifesaver - ms-Icon--LifesaverLock - ms-Icon--Light - ms-Icon--Lightbulb - ms-Icon--LightningBolt - ms-Icon--LightWeight - ms-Icon--Like - ms-Icon--LikeSolid - ms-Icon--Line - ms-Icon--LineChart - ms-Icon--LineSpacing - ms-Icon--LineStyle - ms-Icon--LineThickness - ms-Icon--Link - ms-Icon--Link12 - ms-Icon--LinkedDatabase - ms-Icon--LinkedInLogo - ms-Icon--List - ms-Icon--ListMirrored - ms-Icon--LocaleLanguage - ms-Icon--Location - ms-Icon--LocationCircle - ms-Icon--LocationDot - ms-Icon--LocationFill - ms-Icon--LocationOutline - ms-Icon--Lock - ms-Icon--Lock12 - ms-Icon--LockSolid - ms-Icon--LogRemove - ms-Icon--LookupEntities - ms-Icon--LowerBrightness - ms-Icon--LyncLogo - ms-Icon--M365InvoicingLogo - ms-Icon--Mail - ms-Icon--MailAlert - ms-Icon--MailAttached - ms-Icon--MailCheck - ms-Icon--MailFill - ms-Icon--MailForward - ms-Icon--MailForwardMirrored - ms-Icon--MailLowImportance - ms-Icon--MailOptions - ms-Icon--MailPause - ms-Icon--MailReminder - ms-Icon--MailRepeat - ms-Icon--MailReply - ms-Icon--MailReplyAll - ms-Icon--MailReplyAllMirrored - ms-Icon--MailReplyMirrored - ms-Icon--MailSchedule - ms-Icon--MailSolid - ms-Icon--MailTentative - ms-Icon--MailTentativeMirrored - ms-Icon--MailUndelivered - ms-Icon--ManagerSelfService - ms-Icon--Manufacturing - ms-Icon--MapDirections - ms-Icon--MapLayers - ms-Icon--MapPin - ms-Icon--MapPinSolid - ms-Icon--MarkAsProtected - ms-Icon--MarkDownLanguage - ms-Icon--Market - ms-Icon--MarketDown - ms-Icon--MasterDatabase - ms-Icon--MaximumValue - ms-Icon--Medal - ms-Icon--MedalSolid - ms-Icon--Media - ms-Icon--MediaAdd - ms-Icon--Medical - ms-Icon--Megaphone - ms-Icon--MegaphoneSolid - ms-Icon--Memo - ms-Icon--Merge - ms-Icon--MergeDuplicate - ms-Icon--Message - ms-Icon--MessageFill - ms-Icon--MicOff - ms-Icon--MicOff2 - ms-Icon--Microphone - ms-Icon--MicrosoftFlowLogo - ms-Icon--MicrosoftStaffhubLogo - ms-Icon--MicrosoftTranslatorLogo - ms-Icon--MicrosoftTranslatorLogoBlue - ms-Icon--MicrosoftTranslatorLogoGreen - ms-Icon--MiniContract - ms-Icon--MiniContractMirrored - ms-Icon--MiniExpand - ms-Icon--MiniExpandMirrored - ms-Icon--MiniLink - ms-Icon--MinimumValue - ms-Icon--MobileReport - ms-Icon--MobileSelected - ms-Icon--ModelingView - ms-Icon--Money - ms-Icon--More - ms-Icon--MoreSports - ms-Icon--MoreVertical - ms-Icon--MountainClimbing - ms-Icon--Move - ms-Icon--Movers - ms-Icon--MoveToFolder - ms-Icon--MSNLogo - ms-Icon--MSNVideos - ms-Icon--MSNVideosSolid - ms-Icon--MultiSelect - ms-Icon--MultiSelectMirrored - ms-Icon--MusicInCollection - ms-Icon--MusicInCollectionFill - ms-Icon--MusicNote - ms-Icon--MuteChat - ms-Icon--MyMoviesTV - ms-Icon--Nav2DMapView - ms-Icon--NavigateBack - ms-Icon--NavigateBackMirrored - ms-Icon--NavigateExternalInline - ms-Icon--NavigateForward - ms-Icon--NavigateForwardMirrored - ms-Icon--NavigationFlipper - ms-Icon--NetworkTower - ms-Icon--NewAnalyticsQuery - ms-Icon--NewFolder - ms-Icon--NewMail - ms-Icon--News - ms-Icon--NewsSearch - ms-Icon--NewTeamProject - ms-Icon--Next - ms-Icon--NormalWeight - ms-Icon--NoteForward - ms-Icon--NotePinned - ms-Icon--NoteReply - ms-Icon--NotExecuted - ms-Icon--NotImpactedSolid - ms-Icon--NugetLogo - ms-Icon--NumberedList - ms-Icon--NumberedListNumber - ms-Icon--NumberedListNumberMirrored - ms-Icon--NumberedListText - ms-Icon--NumberedListTextMirrored - ms-Icon--NumberField - ms-Icon--NumberSequence - ms-Icon--NumberSymbol - ms-Icon--Octagon - ms-Icon--OEM - ms-Icon--OfficeAddinsLogo - ms-Icon--OfficeAssistantLogo - ms-Icon--OfficeChat - ms-Icon--OfficeChatSolid - ms-Icon--OfficeFormsLogo - ms-Icon--OfficeFormsLogo16 - ms-Icon--OfficeFormsLogo24 - ms-Icon--OfficeFormsLogoFill - ms-Icon--OfficeFormsLogoFill16 - ms-Icon--OfficeFormsLogoFill24 - ms-Icon--OfficeFormsLogoInverse - ms-Icon--OfficeFormsLogoInverse16 - ms-Icon--OfficeFormsLogoInverse24 - ms-Icon--OfficeLogo - ms-Icon--OfficeStoreLogo - ms-Icon--OfficeVideoLogo - ms-Icon--OfficeVideoLogoFill - ms-Icon--OfficeVideoLogoInverse - ms-Icon--OfflineOneDriveParachute - ms-Icon--OfflineOneDriveParachuteDisabled - ms-Icon--OfflineStorage - ms-Icon--OfflineStorageSolid - ms-Icon--Onboarding - ms-Icon--OneDriveAdd - ms-Icon--OneDriveFolder16 - ms-Icon--OneDriveLogo - ms-Icon--OneNoteEduLogoInverse - ms-Icon--OneNoteLogo - ms-Icon--OneNoteLogo16 - ms-Icon--OneNoteLogoFill - ms-Icon--OneNoteLogoFill16 - ms-Icon--OneNoteLogoInverse - ms-Icon--OneNoteLogoInverse16 - ms-Icon--OpenEnrollment - ms-Icon--OpenFile - ms-Icon--OpenFolderHorizontal - ms-Icon--OpenInNewTab - ms-Icon--OpenInNewWindow - ms-Icon--OpenPane - ms-Icon--OpenPaneMirrored - ms-Icon--OpenSource - ms-Icon--OpenWith - ms-Icon--OpenWithMirrored - ms-Icon--Org - ms-Icon--Orientation - ms-Icon--Orientation2 - ms-Icon--OutlookLogo - ms-Icon--OutlookLogo16 - ms-Icon--OutlookLogoFill - ms-Icon--OutlookLogoFill16 - ms-Icon--OutlookLogoInverse - ms-Icon--OutlookLogoInverse16 - ms-Icon--OutOfOffice - ms-Icon--Package - ms-Icon--Packages - ms-Icon--Padding - ms-Icon--PaddingBottom - ms-Icon--PaddingLeft - ms-Icon--PaddingRight - ms-Icon--PaddingTop - ms-Icon--Page - ms-Icon--PageAdd - ms-Icon--PageArrowRight - ms-Icon--PageCheckedin - ms-Icon--PageCheckedOut - ms-Icon--PageData - ms-Icon--PageEdit - ms-Icon--PageHeader - ms-Icon--PageHeaderEdit - ms-Icon--PageLeft - ms-Icon--PageLink - ms-Icon--PageList - ms-Icon--PageListFilter - ms-Icon--PageListMirroredSolid - ms-Icon--PageListSolid - ms-Icon--PageLock - ms-Icon--PageRemove - ms-Icon--PageRight - ms-Icon--PageShared - ms-Icon--PageSolid - ms-Icon--PanoIndicator - ms-Icon--Parachute - ms-Icon--ParachuteSolid - ms-Icon--Parameter - ms-Icon--ParkingLocation - ms-Icon--ParkingLocationMirrored - ms-Icon--ParkingMirroredSolid - ms-Icon--ParkingSolid - ms-Icon--PartlyCloudyDay - ms-Icon--PartlyCloudyNight - ms-Icon--PartyLeader - ms-Icon--PassiveAuthentication - ms-Icon--PasswordField - ms-Icon--Paste - ms-Icon--PasteAsCode - ms-Icon--PasteAsText - ms-Icon--Pause - ms-Icon--PaymentCard - ms-Icon--PC1 - ms-Icon--PDF - ms-Icon--PencilReply - ms-Icon--Pentagon - ms-Icon--PenWorkspace - ms-Icon--People - ms-Icon--PeopleAdd - ms-Icon--PeopleAlert - ms-Icon--PeopleBlock - ms-Icon--PeoplePause - ms-Icon--PeopleRepeat - ms-Icon--Permissions - ms-Icon--PermissionsSolid - ms-Icon--Personalize - ms-Icon--Phishing - ms-Icon--Phone - ms-Icon--Photo - ms-Icon--Photo2 - ms-Icon--Photo2Add - ms-Icon--Photo2Fill - ms-Icon--Photo2Remove - ms-Icon--PhotoCollection - ms-Icon--PhotoVideoMedia - ms-Icon--Picture - ms-Icon--PictureCenter - ms-Icon--PictureFill - ms-Icon--PictureLibrary - ms-Icon--PicturePosition - ms-Icon--PictureStretch - ms-Icon--PictureTile - ms-Icon--PieDouble - ms-Icon--PieSingle - ms-Icon--PieSingleSolid - ms-Icon--Pill - ms-Icon--Pin - ms-Icon--Pinned - ms-Icon--PinnedFill - ms-Icon--PinnedSolid - ms-Icon--PinSolid12 - ms-Icon--PinSolidOff12 - ms-Icon--PivotChart - ms-Icon--PlainText - ms-Icon--PlannerLogo - ms-Icon--PlanView - ms-Icon--Play - ms-Icon--PlaybackRate1x - ms-Icon--PlayerSettings - ms-Icon--PlayResume - ms-Icon--PlayReverse - ms-Icon--PlayReverseResume - ms-Icon--Plug - ms-Icon--PlugConnected - ms-Icon--PlugDisconnected - ms-Icon--PlugSolid - ms-Icon--POI - ms-Icon--POISolid - ms-Icon--PollResults - ms-Icon--PostUpdate - ms-Icon--PowerApps - ms-Icon--PowerApps2Logo - ms-Icon--PowerAppsCDS - ms-Icon--PowerAppsLogo - ms-Icon--PowerBILogo - ms-Icon--PowerBILogo16 - ms-Icon--PowerBILogoBackplate16 - ms-Icon--PowerButton - ms-Icon--PowerPointDocument - ms-Icon--PowerPointLogo - ms-Icon--PowerPointLogo16 - ms-Icon--PowerPointLogoFill - ms-Icon--PowerPointLogoFill16 - ms-Icon--PowerPointLogoInverse - ms-Icon--PowerPointLogoInverse16 - ms-Icon--PowerShell - ms-Icon--PowerShell2 - ms-Icon--Precipitation - ms-Icon--PresenceChickletVideo - ms-Icon--Presentation - ms-Icon--Presentation12 - ms-Icon--Preview - ms-Icon--PreviewLink - ms-Icon--Previous - ms-Icon--PrimaryCalendar - ms-Icon--Print - ms-Icon--PrintfaxPrinterFile - ms-Icon--Processing - ms-Icon--ProcessMetaTask - ms-Icon--Product - ms-Icon--ProductCatalog - ms-Icon--ProductionFloorManagement - ms-Icon--ProductList - ms-Icon--ProductRelease - ms-Icon--ProductVariant - ms-Icon--ProfileSearch - ms-Icon--ProFootball - ms-Icon--ProgressLoopInner - ms-Icon--ProgressLoopOuter - ms-Icon--ProgressRingDots - ms-Icon--ProHockey - ms-Icon--ProjectCollection - ms-Icon--ProjectDocument - ms-Icon--ProjectLogo16 - ms-Icon--ProjectLogo32 - ms-Icon--ProjectLogoFill16 - ms-Icon--ProjectLogoFill32 - ms-Icon--ProjectLogoInverse - ms-Icon--PromotedDatabase - ms-Icon--ProtectedDocument - ms-Icon--ProtectionCenterLogo32 - ms-Icon--ProtectRestrict - ms-Icon--PublicCalendar - ms-Icon--PublicContactCard - ms-Icon--PublicContactCardMirrored - ms-Icon--PublicEmail - ms-Icon--PublicFolder - ms-Icon--PublishContent - ms-Icon--PublishCourse - ms-Icon--PublisherLogo - ms-Icon--PublisherLogo16 - ms-Icon--PublisherLogoFill - ms-Icon--PublisherLogoFill16 - ms-Icon--PublisherLogoInverse16 - ms-Icon--Puzzle - ms-Icon--PY - ms-Icon--PythonLanguage - ms-Icon--QandA - ms-Icon--QandAMirror - ms-Icon--QRCode - ms-Icon--QuadColumn - ms-Icon--Quantity - ms-Icon--QuarterCircle - ms-Icon--QueryList - ms-Icon--Questionnaire - ms-Icon--QuestionnaireMirrored - ms-Icon--QuickNote - ms-Icon--QuickNoteSolid - ms-Icon--R - ms-Icon--RadioBtnOff - ms-Icon--RadioBtnOn - ms-Icon--RadioBullet - ms-Icon--Rain - ms-Icon--RainShowersDay - ms-Icon--RainShowersNight - ms-Icon--RainSnow - ms-Icon--RawSource - ms-Icon--Read - ms-Icon--ReadingMode - ms-Icon--ReadingModeSolid - ms-Icon--ReadOutLoud - ms-Icon--RealEstate - ms-Icon--ReceiptCheck - ms-Icon--ReceiptForward - ms-Icon--ReceiptReply - ms-Icon--ReceiptTentative - ms-Icon--ReceiptTentativeMirrored - ms-Icon--ReceiptUndelivered - ms-Icon--Recent - ms-Icon--Record2 - ms-Icon--RecruitmentManagement - ms-Icon--RectangleShape - ms-Icon--RectangleShapeSolid - ms-Icon--RectangularClipping - ms-Icon--RecurringEvent - ms-Icon--RecurringTask - ms-Icon--RecycleBin - ms-Icon--Redeploy - ms-Icon--RedEye - ms-Icon--Redo - ms-Icon--Refresh - ms-Icon--Relationship - ms-Icon--ReleaseDefinition - ms-Icon--ReleaseGate - ms-Icon--ReleaseGateCheck - ms-Icon--ReleaseGateError - ms-Icon--ReminderGroup - ms-Icon--ReminderPerson - ms-Icon--ReminderTime - ms-Icon--Remote - ms-Icon--Remove - ms-Icon--RemoveEvent - ms-Icon--RemoveFilter - ms-Icon--RemoveFromShoppingList - ms-Icon--RemoveFromTrash - ms-Icon--RemoveLink - ms-Icon--RemoveLinkChain - ms-Icon--RemoveLinkX - ms-Icon--RemoveOccurrence - ms-Icon--Rename - ms-Icon--RenewalCurrent - ms-Icon--RenewalFuture - ms-Icon--ReopenPages - ms-Icon--Repair - ms-Icon--RepeatAll - ms-Icon--RepeatOne - ms-Icon--Reply - ms-Icon--ReplyAll - ms-Icon--ReplyAllAlt - ms-Icon--ReplyAllMirrored - ms-Icon--ReplyAlt - ms-Icon--ReplyMirrored - ms-Icon--Repo - ms-Icon--ReportAdd - ms-Icon--ReportDocument - ms-Icon--ReportHacked - ms-Icon--ReportLibrary - ms-Icon--ReportLibraryMirrored - ms-Icon--ReportLock - ms-Icon--ReportWarning - ms-Icon--RepoSolid - ms-Icon--Rerun - ms-Icon--ReservationOrders - ms-Icon--ResetDevice - ms-Icon--ResponsesMenu - ms-Icon--ReturnKey - ms-Icon--ReturnToSession - ms-Icon--ReviewRequestMirroredSolid - ms-Icon--ReviewRequestSolid - ms-Icon--ReviewResponseSolid - ms-Icon--ReviewSolid - ms-Icon--RevToggleKey - ms-Icon--Rewind - ms-Icon--Ribbon - ms-Icon--RibbonSolid - ms-Icon--RightDoubleQuote - ms-Icon--RightTriangle - ms-Icon--Ringer - ms-Icon--RingerOff - ms-Icon--RingerRemove - ms-Icon--RingerSolid - ms-Icon--Robot - ms-Icon--Rocket - ms-Icon--Room - ms-Icon--Rotate - ms-Icon--Rotate90Clockwise - ms-Icon--Rotate90CounterClockwise - ms-Icon--RowsChild - ms-Icon--RowsGroup - ms-Icon--Rugby - ms-Icon--Running - ms-Icon--Sad - ms-Icon--SadSolid - ms-Icon--Save - ms-Icon--SaveAll - ms-Icon--SaveAndClose - ms-Icon--SaveAs - ms-Icon--SaveTemplate - ms-Icon--SaveToMobile - ms-Icon--Savings - ms-Icon--ScaleUp - ms-Icon--ScaleVolume - ms-Icon--ScatterChart - ms-Icon--ScheduleEventAction - ms-Icon--SchoolDataSyncLogo - ms-Icon--ScopeTemplate - ms-Icon--ScreenCast - ms-Icon--Script - ms-Icon--ScrollUpDown - ms-Icon--Search - ms-Icon--SearchAndApps - ms-Icon--SearchBookmark - ms-Icon--SearchCalendar - ms-Icon--SearchData - ms-Icon--SearchIssue - ms-Icon--SearchIssueMirrored - ms-Icon--SearchNearby - ms-Icon--SecondaryNav - ms-Icon--Section - ms-Icon--Sections - ms-Icon--SecurityGroup - ms-Icon--SeeDo - ms-Icon--SelectAll - ms-Icon--Sell - ms-Icon--SemiboldWeight - ms-Icon--Send - ms-Icon--SendMirrored - ms-Icon--Separator - ms-Icon--Server - ms-Icon--ServerEnviroment - ms-Icon--ServerProcesses - ms-Icon--SetAction - ms-Icon--Settings - ms-Icon--ShakeDevice - ms-Icon--Shapes - ms-Icon--Share - ms-Icon--ShareiOS - ms-Icon--SharepointAppIcon16 - ms-Icon--SharepointLogo - ms-Icon--SharepointLogoFill - ms-Icon--SharepointLogoInverse - ms-Icon--Shield - ms-Icon--ShieldAlert - ms-Icon--ShieldSolid - ms-Icon--Shirt - ms-Icon--Shop - ms-Icon--ShoppingCart - ms-Icon--ShoppingCartSolid - ms-Icon--ShopServer - ms-Icon--ShowGrid - ms-Icon--ShowResults - ms-Icon--ShowResultsMirrored - ms-Icon--ShowTimeAs - ms-Icon--SidePanel - ms-Icon--SidePanelMirrored - ms-Icon--Signin - ms-Icon--SignOut - ms-Icon--SingleBookmark - ms-Icon--SingleBookmarkSolid - ms-Icon--SingleColumn - ms-Icon--SingleColumnEdit - ms-Icon--SIPMove - ms-Icon--SiteScan - ms-Icon--SizeLegacy - ms-Icon--SkiResorts - ms-Icon--SkypeArrow - ms-Icon--SkypeCheck - ms-Icon--SkypeCircleArrow - ms-Icon--SkypeCircleCheck - ms-Icon--SkypeCircleClock - ms-Icon--SkypeCircleMinus - ms-Icon--SkypeCircleSlash - ms-Icon--SkypeClock - ms-Icon--SkypeForBusinessLogo - ms-Icon--SkypeForBusinessLogo16 - ms-Icon--SkypeForBusinessLogoFill - ms-Icon--SkypeForBusinessLogoFill16 - ms-Icon--SkypeLogo - ms-Icon--SkypeLogo16 - ms-Icon--SkypeMessage - ms-Icon--SkypeMinus - ms-Icon--SkypeSlash - ms-Icon--Slider - ms-Icon--SliderHandleSize - ms-Icon--SliderThumb - ms-Icon--Slideshow - ms-Icon--SmartGlassRemote - ms-Icon--SnapToGrid - ms-Icon--Snooze - ms-Icon--Snow - ms-Icon--Snowflake - ms-Icon--SnowShowerDay - ms-Icon--SnowShowerNight - ms-Icon--Soccer - ms-Icon--SocialListeningLogo - ms-Icon--Sort - ms-Icon--SortDown - ms-Icon--SortLines - ms-Icon--SortUp - ms-Icon--Source - ms-Icon--Spacer - ms-Icon--Speakers - ms-Icon--SpecialEvent - ms-Icon--SpeedHigh - ms-Icon--Split - ms-Icon--SplitObject - ms-Icon--Sprint - ms-Icon--Squalls - ms-Icon--SquareShapeSolid - ms-Icon--Stack - ms-Icon--StackColumnChart - ms-Icon--StackedBarChart - ms-Icon--StackedColumnChart2 - ms-Icon--StackedColumnChart2Fill - ms-Icon--StackedLineChart - ms-Icon--StackIndicator - ms-Icon--StaffNotebookLogo16 - ms-Icon--StaffNotebookLogo32 - ms-Icon--StaffNotebookLogoFill16 - ms-Icon--StaffNotebookLogoFill32 - ms-Icon--StaffNotebookLogoInverted16 - ms-Icon--StaffNotebookLogoInverted32 - ms-Icon--Starburst - ms-Icon--StarburstSolid - ms-Icon--StatusCircleBlock - ms-Icon--StatusCircleBlock2 - ms-Icon--StatusCircleCheckmark - ms-Icon--StatusCircleErrorX - ms-Icon--StatusCircleExclamation - ms-Icon--StatusCircleInfo - ms-Icon--StatusCircleInner - ms-Icon--StatusCircleOuter - ms-Icon--StatusCircleQuestionMark - ms-Icon--StatusCircleRing - ms-Icon--StatusCircleSync - ms-Icon--StatusErrorFull - ms-Icon--StatusTriangle - ms-Icon--StatusTriangleExclamation - ms-Icon--StatusTriangleInner - ms-Icon--StatusTriangleOuter - ms-Icon--Step - ms-Icon--StepInsert - ms-Icon--StepShared - ms-Icon--StepSharedAdd - ms-Icon--StepSharedInsert - ms-Icon--StickyNotesOutlineAppIcon - ms-Icon--StickyNotesSolidAppIcon - ms-Icon--StockDown - ms-Icon--StockUp - ms-Icon--Stop - ms-Icon--StopSolid - ms-Icon--Stopwatch - ms-Icon--StorageOptical - ms-Icon--StoreLogo16 - ms-Icon--StoreLogoMed20 - ms-Icon--Storyboard - ms-Icon--Streaming - ms-Icon--StreamingOff - ms-Icon--StreamLogo - ms-Icon--Street - ms-Icon--StreetsideSplitMinimize - ms-Icon--Strikethrough - ms-Icon--Subscribe - ms-Icon--Subscript - ms-Icon--SubstitutionsIn - ms-Icon--Suitcase - ms-Icon--SunAdd - ms-Icon--Sunny - ms-Icon--SunQuestionMark - ms-Icon--Superscript - ms-Icon--SurveyQuestions - ms-Icon--SwayLogo16 - ms-Icon--SwayLogo32 - ms-Icon--SwayLogoFill16 - ms-Icon--SwayLogoFill32 - ms-Icon--SwayLogoInverse - ms-Icon--Switch - ms-Icon--SwitcherStartEnd - ms-Icon--Sync - ms-Icon--SyncFolder - ms-Icon--SyncOccurence - ms-Icon--SyncStatus - ms-Icon--SyncStatusSolid - ms-Icon--SyncToPC - ms-Icon--System - ms-Icon--Tab - ms-Icon--TabCenter - ms-Icon--Table - ms-Icon--TableComputed - ms-Icon--TableGroup - ms-Icon--TableLink - ms-Icon--Tablet - ms-Icon--TabletMode - ms-Icon--TabletSelected - ms-Icon--TabOneColumn - ms-Icon--TabThreeColumn - ms-Icon--TabTwoColumn - ms-Icon--Tag - ms-Icon--TagSolid - ms-Icon--TagUnknown - ms-Icon--TagUnknown12 - ms-Icon--TagUnknown12Mirror - ms-Icon--TagUnknownMirror - ms-Icon--Taskboard - ms-Icon--TaskGroup - ms-Icon--TaskGroupMirrored - ms-Icon--TaskLogo - ms-Icon--TaskManager - ms-Icon--TaskManagerMirrored - ms-Icon--TaskSolid - ms-Icon--Taxi - ms-Icon--TeamFavorite - ms-Icon--TeamsLogo - ms-Icon--TeamsLogo16 - ms-Icon--TeamsLogoFill - ms-Icon--TeamsLogoFill16 - ms-Icon--TeamsLogoInverse - ms-Icon--Teamwork - ms-Icon--Teeth - ms-Icon--Telemarketer - ms-Icon--TemporaryUser - ms-Icon--Tennis - ms-Icon--TestAutoSolid - ms-Icon--TestBeaker - ms-Icon--TestBeakerSolid - ms-Icon--TestCase - ms-Icon--TestExploreSolid - ms-Icon--TestImpactSolid - ms-Icon--TestParameter - ms-Icon--TestPlan - ms-Icon--TestStep - ms-Icon--TestSuite - ms-Icon--TestUserSolid - ms-Icon--TextBox - ms-Icon--TextCallout - ms-Icon--TextDocument - ms-Icon--TextDocumentShared - ms-Icon--TextField - ms-Icon--TextOverflow - ms-Icon--TFVCLogo - ms-Icon--ThisPC - ms-Icon--ThreeQuarterCircle - ms-Icon--ThumbnailView - ms-Icon--ThumbnailViewMirrored - ms-Icon--Thunderstorms - ms-Icon--Ticket - ms-Icon--Tiles - ms-Icon--Tiles2 - ms-Icon--TimeEntry - ms-Icon--Timeline - ms-Icon--TimelineDelivery - ms-Icon--TimelineMatrixView - ms-Icon--TimelineProgress - ms-Icon--TimePicker - ms-Icon--Timer - ms-Icon--TimeSheet - ms-Icon--ToDoLogoBottom - ms-Icon--ToDoLogoInverse - ms-Icon--ToDoLogoOutline - ms-Icon--ToDoLogoTop - ms-Icon--ToggleBorder - ms-Icon--ToggleFilled - ms-Icon--ToggleLeft - ms-Icon--ToggleRight - ms-Icon--ToggleThumb - ms-Icon--Toll - ms-Icon--Toolbox - ms-Icon--Touch - ms-Icon--TouchPointer - ms-Icon--Trackers - ms-Icon--TrackersMirrored - ms-Icon--Train - ms-Icon--TrainSolid - ms-Icon--TransferCall - ms-Icon--Transition - ms-Icon--TransitionEffect - ms-Icon--TransitionPop - ms-Icon--TransitionPush - ms-Icon--Translate - ms-Icon--Trending12 - ms-Icon--TriangleDown12 - ms-Icon--TriangleLeft12 - ms-Icon--TriangleRight12 - ms-Icon--TriangleShape - ms-Icon--TriangleShapeSolid - ms-Icon--TriangleSolid - ms-Icon--TriangleSolidDown12 - ms-Icon--TriangleSolidLeft12 - ms-Icon--TriangleSolidRight12 - ms-Icon--TriangleSolidUp12 - ms-Icon--TriangleUp12 - ms-Icon--TriggerApproval - ms-Icon--TriggerAuto - ms-Icon--TriggerUser - ms-Icon--Trim - ms-Icon--TrimEnd - ms-Icon--TrimStart - ms-Icon--TripleColumn - ms-Icon--TripleColumnEdit - ms-Icon--TripleColumnWide - ms-Icon--Trophy - ms-Icon--Trophy2 - ms-Icon--Trophy2Solid - ms-Icon--TurnRight - ms-Icon--TVMonitor - ms-Icon--TVMonitorSelected - ms-Icon--TypeScriptLanguage - ms-Icon--Umbrella - ms-Icon--Underline - ms-Icon--Undo - ms-Icon--Uneditable - ms-Icon--Uneditable2 - ms-Icon--Uneditable2Mirrored - ms-Icon--UneditableMirrored - ms-Icon--UneditableSolid12 - ms-Icon--UneditableSolidMirrored12 - ms-Icon--Unfavorite - ms-Icon--UngroupObject - ms-Icon--Unknown - ms-Icon--UnknownCall - ms-Icon--UnknownMirrored - ms-Icon--UnknownMirroredSolid - ms-Icon--UnknownSolid - ms-Icon--Unlock - ms-Icon--UnlockSolid - ms-Icon--Unpin - ms-Icon--UnpublishContent - ms-Icon--UnSetColor - ms-Icon--UnstackSelected - ms-Icon--Unsubscribe - ms-Icon--UnsyncFolder - ms-Icon--UnsyncOccurence - ms-Icon--Untag - ms-Icon--Up - ms-Icon--UpgradeAnalysis - ms-Icon--Upload - ms-Icon--USB - ms-Icon--UserEvent - ms-Icon--UserFollowed - ms-Icon--UserGauge - ms-Icon--UserOptional - ms-Icon--UserPause - ms-Icon--UserRemove - ms-Icon--UserSync - ms-Icon--UserWarning - ms-Icon--Vacation - ms-Icon--Variable - ms-Icon--Variable2 - ms-Icon--VariableGroup - ms-Icon--VB - ms-Icon--VennDiagram - ms-Icon--VerifiedBrand - ms-Icon--VerifiedBrandSolid - ms-Icon--VersionControlPush - ms-Icon--VerticalDistributeCenter - ms-Icon--Video - ms-Icon--Video360Generic - ms-Icon--VideoLightOff - ms-Icon--VideoOff - ms-Icon--VideoSearch - ms-Icon--VideoSolid - ms-Icon--View - ms-Icon--ViewAll - ms-Icon--ViewAll2 - ms-Icon--ViewDashboard - ms-Icon--ViewList - ms-Icon--ViewListGroup - ms-Icon--ViewListTree - ms-Icon--ViewOriginal - ms-Icon--VisioDiagram - ms-Icon--VisioDiagramSync - ms-Icon--VisioDocument - ms-Icon--VisioLogo - ms-Icon--VisioLogo16 - ms-Icon--VisioLogoFill - ms-Icon--VisioLogoFill16 - ms-Icon--VisioLogoInverse - ms-Icon--VisioLogoInverse16 - ms-Icon--VisualBasicLanguage - ms-Icon--VisuallyImpaired - ms-Icon--VisualsFolder - ms-Icon--VisualsStore - ms-Icon--VisualStudioIDELogo32 - ms-Icon--VisualStudioLogo - ms-Icon--VoicemailForward - ms-Icon--VoicemailIRM - ms-Icon--VoicemailReply - ms-Icon--Volume0 - ms-Icon--Volume1 - ms-Icon--Volume2 - ms-Icon--Volume3 - ms-Icon--VolumeDisabled - ms-Icon--VSTSAltLogo1 - ms-Icon--VSTSAltLogo2 - ms-Icon--VSTSLogo - ms-Icon--Waffle - ms-Icon--WaffleOffice365 - ms-Icon--WaitlistConfirm - ms-Icon--WaitlistConfirmMirrored - ms-Icon--Warning - ms-Icon--Warning12 - ms-Icon--WarningSolid - ms-Icon--WavingHand - ms-Icon--WebAppBuilderFragment - ms-Icon--WebAppBuilderFragmentCreate - ms-Icon--WebAppBuilderModule - ms-Icon--WebAppBuilderSlot - ms-Icon--Webcam2 - ms-Icon--Webcam2Off - ms-Icon--WebComponents - ms-Icon--WebPublish - ms-Icon--Website - ms-Icon--WebTemplate - ms-Icon--Weights - ms-Icon--Wheelchair - ms-Icon--WhiteBoardApp16 - ms-Icon--WhiteBoardApp32 - ms-Icon--WifiEthernet - ms-Icon--WifiWarning4 - ms-Icon--WindDirection - ms-Icon--WindowEdit - ms-Icon--WindowsLogo - ms-Icon--Wines - ms-Icon--WipePhone - ms-Icon--WordDocument - ms-Icon--WordLogo - ms-Icon--WordLogo16 - ms-Icon--WordLogoFill - ms-Icon--WordLogoFill16 - ms-Icon--WordLogoInverse - ms-Icon--WordLogoInverse16 - ms-Icon--Work - ms-Icon--WorkFlow - ms-Icon--WorkforceManagement - ms-Icon--WorkItem - ms-Icon--WorkItemAlert - ms-Icon--WorkItemBar - ms-Icon--WorkItemBarSolid - ms-Icon--WorkItemBug - ms-Icon--World - ms-Icon--WorldClock - ms-Icon--YammerLogo - ms-Icon--ZipFolder - ms-Icon--Zoom - ms-Icon--ZoomIn - ms-Icon--ZoomOut - ms-Icon--ZoomToFit ### Fluent UI Core - Buttons URL: https://blog.lsonline.fr/fluent-ui-core-buttons/ Last updated: 2026-06-21T01:25:55.000Z [Back to Style Guide page](https://blog.lsonline.fr/style-guide/ "Back to Guide Style page") ```HTML ``` Primary ```HTML ``` Default ### Fluent UI Core - Typography URL: https://blog.lsonline.fr/fluent-ui-core-typography/ Last updated: 2026-06-21T01:24:03.000Z [Back to Style Guide page](https://blog.lsonline.fr/style-guide/ "Back to Guide Style page") Fabric includes 10 base font classes that represent the type ramp for the Office Design Language. Each base class sets a default **size, weight, and color**. - ms-font-su 42px Segoe UI Light ms-color-neutralPrimary - ms-font-xxl 28px Segoe UI Light ms-color-neutralPrimary - ms-font-xl-plus 24px Segoe UI Light ms-color-neutralPrimary - ms-font-xl 21px Segoe UI Light ms-color-neutralPrimary - ms-font-l 17px Segoe UI Semilight ms-color-neutralPrimary - ms-font-m-plus 15px Segoe UI Regular ms-color-neutralPrimary - ms-font-m 14px Segoe UI Regular ms-color-neutralPrimary - ms-font-s-plus 13px Segoe UI Regular ms-color-neutralPrimary - ms-font-s 12px Segoe UI Regular ms-color-neutralPrimary - ms-font-xs 11px Segoe UI Regular ms-color-neutralPrimary - ms-font-mi 10px Segoe UI Semibold ms-color-neutralPrimary ## Font weight Use these classes to set the font weight, independent of its size and color. Class Weight ms-fontWeight-light Light ms-fontWeight-semilight Semilight ms-fontWeight-regular Regular ms-fontWeight-semibold Semi Bold ms-fontWeight-bold Bold ## Font size Use these classes to set the font size, independent of its weight and color. Class Size ms-fontSize-su 42px ms-fontSize-xxl 28px ms-fontSize-xlPlus 24px ms-fontSize-xl 21px ms-fontSize-l 17px ms-fontSize-mPlus 15px ms-fontSize-m 14px ms-fontSize-sPlus 13px ms-fontSize-s 12px ms-fontSize-xs 11px ms-fontSize-mi 10px ## Alternative fonts Usage of Fabric's default web font, Segoe UI, is subject to the [assets license](https://aka.ms/fabric-assets-license/?ref=blog.lsonline.fr). If your app does not meet these requirements, you can substitute another font in place of Segoe UI. There are two methods available: 1. Use [Selawik](https://github.com/Microsoft/Selawik?ref=blog.lsonline.fr), an open source alternative to Segoe UI from Microsoft. With support for this font built-in to Fabric, it's as simple as applying an additional class to the root "ms-Fabric" class that wraps your application. If Segoe UI is not installed on the user's system, Selawik will be used instead. ```HTML
...
``` ### This text is now in Selawik. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla semper leo a elit malesuada scelerisque. Nam et accumsan nibh. Nulla facilisi. Nulla commodo vestibulum lobortis. Mauris interdum vitae mi a blandit. Duis odio mi, gravida et velit sit amet, pulvinar porta magna. Ut fermentum erat tortor, eu bibendum felis laoreet vel. Nulla vitae erat lacinia, mollis felis id, mollis risus. Integer in metus lacus. Ut ac ligula nunc. Vivamus sed lacinia ante. 2. Specify a custom font for your application. This can be a commonly-installed local font, such as Helvetica, or a web font that you have included a [@font-face declaration](https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face?redirectlocale=en-US&redirectslug=CSS%2F%40font-face&ref=blog.lsonline.fr) for. ```HTML .ms-Fabric { font-family: Helvetica, Arial, sans-serif; } ``` ### This text is now in Helvetica. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla semper leo a elit malesuada scelerisque. Nam et accumsan nibh. Nulla facilisi. Nulla commodo vestibulum lobortis. Mauris interdum vitae mi a blandit. Duis odio mi, gravida et velit sit amet, pulvinar porta magna. Ut fermentum erat tortor, eu bibendum felis laoreet vel. Nulla vitae erat lacinia, mollis felis id, mollis risus. Integer in metus lacus. Ut ac ligula nunc. Vivamus sed lacinia ante. ### Fluent UI Core - Color URL: https://blog.lsonline.fr/fluent-ui-core-color/ Last updated: 2026-06-21T01:24:55.000Z [Back to Style Guide page](https://blog.lsonline.fr/style-guide/ "Back to Guide Style page") Fabric includes 9 theme colors and 11 neutral colors. Each has helper classes for text, border, background, and hover states. ## Theme colors Use theme colors in wayfinding, navigation, and key interactions like primary actions and current or selected indicators. Theme Darker #004578 Aa Background ms-bgColor-themeDarker Font ms-fontColor-themeDarker Border ms-borderColor-themeDarker Theme Dark #005A9E Aa Background ms-bgColor-themeDark Font ms-fontColor-themeDark Border ms-borderColor-themeDark Theme Dark Alt #106EBE Aa Background ms-bgColor-themeDarkAlt Font ms-fontColor-themeDarkAlt Border ms-borderColor-themeDarkAlt Theme Primary #0078D7 Aa Background ms-bgColor-themePrimary Font ms-fontColor-themePrimary Border ms-borderColor-themePrimary Theme Secondary #2b88D8 Aa Background ms-bgColor-themeSecondary Font ms-fontColor-themeSecondary Border ms-borderColor-themeSecondary Theme Tertiary #71AFE5 Aa Background ms-bgColor-themeTertiary Font ms-fontColor-themeTertiary Border ms-borderColor-themeTertiary Theme Light #C7E0F4 Aa Background ms-bgColor-themeLight Font ms-fontColor-themeLight Border ms-borderColor-themeLight Theme Lighter #DEECF9 Aa Background ms-bgColor-themeLighter Font ms-fontColor-themeLighter Border ms-borderColor-themeLighter Theme Lighter Alt #EFF6FC Aa Background ms-bgColor-themeLighterAlt Font ms-fontColor-themeLighterAlt Border ms-borderColor-themeLighterAlt ## Neutral Colors Neutral colors include black, gray, and white. Use darker shades of gray for primary content, such as text and titles. Use black sparingly for high-impact strings (labels, names) and hover states. Use lighter shades of gray for supporting graphic elements and page areas. Black #000000 Aa Background ms-bgColor-black Font ms-fontColor-black Border ms-borderColor-black Gray220 #11100f Aa Background ms-bgColor-gray220 Font ms-fontColor-gray220 Border ms-borderColor-gray220 Gray210 #161514 Aa Background ms-bgColor-gray210 Font ms-fontColor-gray210 Border ms-borderColor-gray210 Gray200 #1b1a19 Aa Background ms-bgColor-gray200 Font ms-fontColor-gray200 Border ms-borderColor-gray200 Gray190 #201f1e Aa Background ms-bgColor-gray190 Font ms-fontColor-gray190 Border ms-borderColor-gray190 Gray180 #252423 Aa Background ms-bgColor-gray180 Font ms-fontColor-gray180 Border ms-borderColor-gray180 Gray170 #292827 Aa Background ms-bgColor-gray170 Font ms-fontColor-gray170 Border ms-borderColor-gray170 Gray160 #323130 Aa Background ms-bgColor-gray160 Font ms-fontColor-gray160 Border ms-borderColor-gray160 Gray150 #3b3a39 Aa Background ms-bgColor-gray150 Font ms-fontColor-gray150 Border ms-borderColor-gray150 Gray140 #484644 Aa Background ms-bgColor-gray140 Font ms-fontColor-gray140 Border ms-borderColor-gray140 Gray130 #605e5c Aa Background ms-bgColor-gray130 Font ms-fontColor-gray130 Border ms-borderColor-gray130 Gray120 #797775 Aa Background ms-bgColor-gray120 Font ms-fontColor-gray120 Border ms-borderColor-gray120 Gray110 #8a8886 Aa Background ms-bgColor-gray110 Font ms-fontColor-gray110 Border ms-borderColor-gray110 Gray100 #979593 Aa Background ms-bgColor-gray100 Font ms-fontColor-gray100 Border ms-borderColor-gray100 Gray90 #a19f9d Aa Background ms-bgColor-gray90 Font ms-fontColor-gray90 Border ms-borderColor-gray90 Gray80 #b3b0ad Aa Background ms-bgColor-gray80 Font ms-fontColor-gray80 Border ms-borderColor-gray80 Gray70 #bebbb8 Aa Background ms-bgColor-gray70 Font ms-fontColor-gray70 Border ms-borderColor-gray70 Gray60 #c8c6c4 Aa Background ms-bgColor-gray60 Font ms-fontColor-gray60 Border ms-borderColor-gray60 Gray50 #d2d0ce Aa Background ms-bgColor-gray50 Font ms-fontColor-gray50 Border ms-borderColor-gray50 Gray40 #e1dfdd Aa Background ms-bgColor-gray40 Font ms-fontColor-gray40 Border ms-borderColor-gray40 Gray30 #edebe9 Aa Background ms-bgColor-gray30 Font ms-fontColor-gray30 Border ms-borderColor-gray30 Gray20 #f3f2f1 Aa Background ms-bgColor-gray20 Font ms-fontColor-gray20 Border ms-borderColor-gray20 Gray10 #faf9f8 Aa Background ms-bgColor-gray10 Font ms-fontColor-gray10 Border ms-borderColor-gray10 white #ffffff Aa Background ms-bgColor-white Font ms-fontColor-white Border ms-borderColor-white ## Accent Colors Fabric also includes accent colors from the Microsoft color palette. Yellow #FFB900 Aa Background ms-bgColor-yellow Font ms-fontColor-yellow Border ms-borderColor-yellow Light Yellow #FFF100 Aa Background ms-bgColor-yellowLight Font ms-fontColor-yellowLight Border ms-borderColor-yellowLight Orange #D83B01 Aa Background ms-bgColor-orange Font ms-fontColor-orange Border ms-borderColor-orange Orange Light #EA4300 Aa Background ms-bgColor-orangeLight Font ms-fontColor-orangeLight Border ms-borderColor-orangeLight Orange Lighter #FF8C00 Aa Background ms-bgColor-orangeLighter Font ms-fontColor-orangeLighter Border ms-borderColor-orangeLighter Dark Red #A80000 Aa Background ms-bgColor-redDark Font ms-fontColor-redDark Border ms-borderColor-redDark Red #E81123 Aa Background ms-bgColor-red Font ms-fontColor-red Border ms-borderColor-red Magenta Light #E3008C Aa Background ms-bgColor-magentaLight Font ms-fontColor-magentaLight Border ms-borderColor-magentaLight Magenta #B4009E Aa Background ms-bgColor-magenta Font ms-fontColor-magenta Border ms-borderColor-magenta Dark Magenta #5C005C Aa Background ms-bgColor-magentaDark Font ms-fontColor-magentaDark Border ms-borderColor-magentaDark Light Purple #B4A0FF Aa Background ms-bgColor-purpleLight Font ms-fontColor-purpleLight Border ms-borderColor-purpleLight Purple #5C2D91 Aa Background ms-bgColor-purple Font ms-fontColor-purple Border ms-borderColor-purple Dark Purple #32145A Aa Background ms-bgColor-purpleDark Font ms-fontColor-purpleDark Border ms-borderColor-purpleDark Light Blue #00BCF2 Aa Background ms-bgColor-blueLight Font ms-fontColor-blueLight Border ms-borderColor-blueLight Mid Blue #00188F Aa Background ms-bgColor-blueMid Font ms-fontColor-blueMid Border ms-borderColor-blueMid Blue #0078d7 Aa Background ms-bgColor-blue Font ms-fontColor-blue Border ms-borderColor-blue Dark Blue #002050 Aa Background ms-bgColor-blueDark Font ms-fontColor-blueDark Border ms-borderColor-blueDark Light Teal #00B294 Aa Background ms-bgColor-tealLight Font ms-fontColor-tealLight Border ms-borderColor-tealLight Teal #008272 Aa Background ms-bgColor-teal Font ms-fontColor-teal Border ms-borderColor-teal Dark Teal #004B50 Aa Background ms-bgColor-tealDark Font ms-fontColor-tealDark Border ms-borderColor-tealDark Light Green #BAD80A Aa Background ms-bgColor-greenLight Font ms-fontColor-greenLight Border ms-borderColor-greenLight Green #107C10 Aa Background ms-bgColor-green Font ms-fontColor-green Border ms-borderColor-green Dark Green #004B1C Aa Background ms-bgColor-greenDark Font ms-fontColor-greenDark Border ms-borderColor-greenDark ## Message Colors Use these colors when you need to communicate the system's status, such as in a notification or error message. Info (Background) #f4f4f4 Info (Font and Border) #107c10 Background ms-bgColor-info Font ms-fontColor-info Border ms-borderColor-info Success (Background) #dff6dd Success (Font and Border) #107c10 Background ms-bgColor-success Font ms-fontColor-success Border ms-borderColor-success Alert (Background) #fed9cc Alert (Font and Border) #d83b01 Background ms-bgColor-alert Font ms-fontColor-alert Border ms-borderColor-alert Error (Background) #fde7e9 Error (Font and Border) #a80000 Background ms-bgColor-error Font ms-fontColor-error Border ms-borderColor-error ### Fluent UI Core - Responsive Grid URL: https://blog.lsonline.fr/fluent-ui-core-responsive-grid/ Last updated: 2026-06-21T01:27:24.000Z [Back to Style Guide page](https://blog.lsonline.fr/style-guide/ "Back to Guide Style page") Fabric comes with a mobile-first, 12-column, responsive grid that you can use to create flexible layouts for a variety of screen sizes and device types. 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 4 4 4 6 6 12 ### How to use A grid (ms-Grid) can contain multiple rows (ms-Grid-row), each of which has one or more columns (ms-Grid-col). Utility classes (ms-sm6) specify how large each column should be on small, medium, and large devices. The columns in a row should add up to 12 for each device size. ```HTML
First
Second
``` Would result in: First Second ## Inheritance Because Fabric is mobile-first, any layout defined for small screens is automatically inherited by medium and large screens. The small size utilities (ms-sm6) are required. If you want to change the layout on larger screens, you can apply the other utility classes. Try this out! On a large screen, the Example block will be smaller. Try shrinking your browser window – the Example block will take up the entire width of the screen. ### How to use ```HTML
Example
``` Example ## Push and pull You might want your column source order to differ from the display order, or to change the column display order based on the screen size. The push and pull utilities make this possible. Push moves a column to the right; pull moves it to the left. ### How to use ```HTML
first in code
second in code
``` first in code second in code ## Visibility Some designs call for certain content to be shown or hidden depending on the screen size. You can achieve this using Fabric's responsive visibility classes. These allow you to show or hide content at a specific screen size, or across a whole range of sizes. | Visibility class | Hides content on screen of size | | | | | | | ---------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------------- | | | SM | MD | LG | XL | XXL | XXXL | | ms-hiddenSm | Class ms-hiddenSm hides content for screen size SM | Class ms-hiddenSm does not hide content on the screen size MD | Class ms-hiddenSm does not hide content on the screen size LG | Class ms-hiddenSm does not hide content on the screen size XL | Class ms-hiddenSm does not hide content on the screen size XXL | Class ms-hiddenSm does not hide content on the screen size XXXL | | ms-hiddenMd | Class ms-hiddenMd does not hide content on the screen size SM | Class ms-hiddenMd hides content for screen size MD | Class ms-hiddenMd does not hide content on the screen size LG | Class ms-hiddenMd does not hide content on the screen size XL | Class ms-hiddenMd does not hide content on the screen size XXL | Class ms-hiddenMd does not hide content on the screen size XXXL | | ms-hiddenMdDown | Class ms-hiddenMdDown hides content for screen size SM | Class ms-hiddenMdDown hides content for screen size MD | Class ms-hiddenMdDown does not hide content on the screen size LG | Class ms-hiddenMdDown does not hide content on the screen size XL | Class ms-hiddenMdDown does not hide content on the screen size XXL | Class ms-hiddenMdDown does not hide content on the screen size XXXL | | ms-hiddenMdUp | Class ms-hiddenMdUp does not hide content on the screen size SM | Class ms-hiddenMdUp hides content for screen size MD | Class ms-hiddenMdUp hides content for screen size LG | Class ms-hiddenMdUp hides content for screen size XL | Class ms-hiddenMdUp hides content for screen size XXL | Class ms-hiddenMdUp hides content for screen size XXXL | | ms-hiddenLg | Class ms-hiddenLg does not hide content on the screen size SM | Class ms-hiddenLg does not hide content on the screen size MD | Class ms-hiddenLg hides content for screen size LG | Class ms-hiddenLg does not hide content on the screen size XL | Class ms-hiddenLg does not hide content on the screen size XXL | Class ms-hiddenLg does not hide content on the screen size XXXL | | ms-hiddenLgDown | Class ms-hiddenLgDown hides content for screen size SM | Class ms-hiddenLgDown hides content for screen size MD | Class ms-hiddenLgDown hides content for screen size LG | Class ms-hiddenLgDown does not hide content on the screen size XL | Class ms-hiddenLgDown does not hide content on the screen size XXL | Class ms-hiddenLgDown does not hide content on the screen size XXXL | | ms-hiddenLgUp | Class ms-hiddenLgUp does not hide content on the screen size SM | Class ms-hiddenLgUp does not hide content on the screen size MD | Class ms-hiddenLgUp hides content for screen size LG | Class ms-hiddenLgUp hides content for screen size XL | Class ms-hiddenLgUp hides content for screen size XXL | Class ms-hiddenLgUp hides content for screen size XXXL | | ms-hiddenXl | Class ms-hiddenXl does not hide content on the screen size SM | Class ms-hiddenXl does not hide content on the screen size MD | Class ms-hiddenXl does not hide content on the screen size LG | Class ms-hiddenXl hides content for screen size XL | Class ms-hiddenXl does not hide content on the screen size XXL | Class ms-hiddenXl does not hide content on the screen size XXXL | | ms-hiddenXlDown | Class ms-hiddenXlDown hides content for screen size SM | Class ms-hiddenXlDown hides content for screen size MD | Class ms-hiddenXlDown hides content for screen size LG | Class ms-hiddenXlDown hides content for screen size XL | Class ms-hiddenXlDown does not hide content on the screen size XXL | Class ms-hiddenXlDown does not hide content on the screen size XXXL | | ms-hiddenXlUp | Class ms-hiddenXlUp does not hide content on the screen size SM | Class ms-hiddenXlUp does not hide content on the screen size MD | Class ms-hiddenXlUp does not hide content on the screen size LG | Class ms-hiddenXlUp hides content for screen size XL | Class ms-hiddenXlUp hides content for screen size XXL | Class ms-hiddenXlUp hides content for screen size XXXL | | ms-hiddenXxl | Class ms-hiddenXxl does not hide content on the screen size SM | Class ms-hiddenXxl does not hide content on the screen size MD | Class ms-hiddenXxl does not hide content on the screen size LG | Class ms-hiddenXxl does not hide content on the screen size XL | Class ms-hiddenXxl hides content for screen size XXL | Class ms-hiddenXxl does not hide content on the screen size XXXL | | ms-hiddenXxlDown | Class ms-hiddenXxlDown hides content for screen size SM | Class ms-hiddenXxlDown hides content for screen size MD | Class ms-hiddenXxlDown hides content for screen size LG | Class ms-hiddenXxlDown hides content for screen size XL | Class ms-hiddenXxlDown hides content for screen size XXL | Class ms-hiddenXxlDown does not hide content on the screen size XXXL | | ms-hiddenXxlUp | Class ms-hiddenXxlUp does not hide content on the screen size SM | Class ms-hiddenXxlUp does not hide content on the screen size MD | Class ms-hiddenXxlUp does not hide content on the screen size LG | Class ms-hiddenXxlUp does not hide content on the screen size XL | Class ms-hiddenXxlUp hides content for screen size XXL | Class ms-hiddenXxlUp hides content for screen size XXXL | | ms-hiddenXxxl | Class ms-hiddenXxxl does not hide content on the screen size SM | Class ms-hiddenXxxl does not hide content on the screen size MD | Class ms-hiddenXxxl does not hide content on the screen size LG | Class ms-hiddenXxxl does not hide content on the screen size XL | Class ms-hiddenXxxl does not hide content on the screen size XXL | Class ms-hiddenXxxl hides content for screen size XXXL | ### How to use ```HTML
hidden on small
hidden on large up
``` The screen is XL or smaller. The screen is XXL or larger. ## Posts ### Connecter Ghost CMS Γ  Copilot Studio URL: https://blog.lsonline.fr/2026/08/23/ghost-mcp-copilot-studio/ Last updated: 2026-08-23T19:40:55.000Z *Partie 1 d'une sΓ©rie : configuration MCP en HTTP β†’ agent Copilot Studio. Les prochains articles couvriront le BYO MCP Server (Agents 365, en prΓ©version) et les connecteurs personnalisΓ©s Power Apps.* ## Un MCP HTTP pour Ghost CMS Cette plateforme de blog est prΓ©sentement basΓ©e sur [Ghost CMS](https://ghost.org/?ref=blog.lsonline.fr). Γ€ l'Γ¨re de l'IA oΓΉ tester, essayer et utiliser l'IA pour s'aider devient monnaie courante, pourquoi ne pas essayer avec mon blog? Alors, il fallait mettre en place un MCP β€” un serveur *Model Context Protocol* pour Ghost CMS. Avec **GitHub Copilot CLI**, connectΓ© en stdio et une **clΓ© Admin API** Ghost comme identifiant par utilisateur; Γ§a existe dΓ©jΓ . Cette configuration est parfaite sur un poste local : un seul processus, une session locale, une clΓ© dans une variable d'environnement. Mais utiliser ce mΓͺme MCP local pour crΓ©er des articles, gΓ©rer les tags, parcourir les membres, lire les newsletters depuis un environnement **Microsoft 365** (pour qu'un agent puisse Γ  la fois s'appuyer sur des documents SharePoint, des conversations Teams *et* gΓ©rer un blog Ghost), le stdio n'Γ©tait plus une option. Copilot Studio, Microsoft 365 Copilot et tout autre runtime d'agent hΓ©bergΓ© dans le cloud ont besoin d'un serveur joignable depuis Internet β€” ce qui impose un protocole de communication en **HTTP**. [GitHub - Laul0/ghost-mcp: A Model Context Protocol (MCP) server for interacting with Ghost CMS through LLM interfaces like Claude. Allow you to control your Ghost blog by simply asking Claude etc.A Model Context Protocol (MCP) server for interacting with Ghost CMS through LLM interfaces like Claude. Allow you to control your Ghost blog by simply asking Claude etc. - Laul0/ghost-mcp![](https://blog.lsonline.fr/content/images/icon/favicon-d34d92bb-d72b-44ee-81c2-6b09cc394ec0.png)GitHubLaul0![](https://blog.lsonline.fr/content/images/thumbnail/ghost-mcp-80e7b012-9254-43fd-9023-14463e193708)](https://github.com/Laul0/ghost-mcp?ref=blog.lsonline.fr) ## Configurer le serveur Ghost MCP en HTTP Le serveur est distribuΓ© sous forme d'image Docker: ```yaml services: ghost-mcp: image: ghcr.io/laul0/ghost-mcp:latest environment: - GHOST_API_URL=https://your-ghost-site.example - MCP_TRANSPORT=http - MCP_PORT=3000 - MCP_HTTP_PATH=/ ports: - "3000:3000" restart: unless-stopped ``` ```bash docker compose pull docker compose up -d ``` VΓ©rification de l'Γ©tat : `http://:3000/health` doit renvoyer `ok`. Au-delΓ  de localhost, placer un reverse proxy (Nginx, Caddy, Traefik) devant pour avoir une connexion HTTPS via une AutoritΓ© de certification (ex: Let’s Encrypt), car Copilot Studio et Microsoft 365 n'accepteront de se connecter qu'avec une URL public sΓ©curisΓ©e `https://`. > \[info\]Important > > **L'URL doit Γͺtre joignable publiquement.** Il y a en rΓ©alitΓ© deux liaisons rΓ©seau distinctes, et les deux doivent utiliser un nom de domaine public, jamais un nom de service Docker interne : > > **β€’ Copilot Studio β†’ serveur MCP** : Copilot Studio et Microsoft 365 Copilot s'exΓ©cutent dans le cloud β€” ils ne peuvent rΓ©soudre ni un nom d'hΓ΄te interne Γ  Docker, ni une adresse `localhost`/`127.0.0.1`, ni une machine uniquement accessible depuis votre LAN/VPN. Il faut le point de terminaison public, en `https://`, derriΓ¨re votre reverse proxy. > **β€’ Conteneur MCP β†’ application Ghost (`GHOST_API_URL`)** : c'est le piΓ¨ge dans lequel je suis moi-mΓͺme tombΓ©. Si votre `docker-compose.yml` dΓ©finit un service Ghost nommΓ©, par exemple, `ghost-app`, il est tentant de configurer `GHOST_API_URL=http://ghost-app:2368` en s'appuyant sur le rΓ©seau Docker interne, puisque les deux conteneurs tournent cΓ΄te Γ  cΓ΄te. Dans la pratique, Γ§a ne fonctionne pas de faΓ§on fiable : il faut renseigner l'URL publique rΓ©elle du blog, `https://blog.mydomain.com`, mΓͺme quand le conteneur MCP et le conteneur Ghost sont dans le mΓͺme `docker-compose.yml`. ### Un conteneur, une instance Ghost β€” par conception `GHOST_API_URL` est figΓ© dans le conteneur au moment du dΓ©ploiement via une variable d'environnement. C'est voulu : le serveur MCP est liΓ© en permanence Γ  uneseule instance Ghost. MΓͺme si chaque client fournit son propre identifiant Ghost, aucun client β€” Copilot CLI, Claude ou Copilot Studio β€” ne peut rediriger les appels d'outils vers une autre instance Ghost en passant une URL diffΓ©rente. i L'identifiant contrΓ΄le *qui* peut agir et *ce qu'il est autorisΓ© Γ  faire* sur ce blog ; la configuration du conteneur contrΓ΄le quelle instance de Ghost doit Γͺtre utilisΓ©e. Si vous gΓ©rez plusieurs sites Ghost, dΓ©ployez un conteneur Ghost MCP (avec sa propre URL publique) par site, plutΓ΄t que de partager un seul conteneur entre plusieurs sites. ### Conserver un accΓ¨s par utilisateur C'est le choix de conception qui compte le plus : **le conteneur ne dΓ©tient jamais d'identifiant Ghost partagΓ©.** Seule la variable `GHOST_API_URL` vit dans l'environnement du conteneur. Chaque client MCP β€” Copilot CLI, Claude, VS Code, ou plus tard Copilot Studio β€” doit envoyer sa propre clΓ© Ghost via un en-tΓͺte de requΓͺte : | Γ‰lΓ©ment | ConfigurΓ© par | ConfigurΓ© oΓΉ | | ------------------- | ----------------------------------------- | ----------------------------------------------------------------------- | | GHOST\_API\_URL | Administrateur | Variable d'environnement Docker | | Identifiant Ghost | Chaque client/utilisateur MCP | En-tΓͺte Authorization: Bearer (ou l'ancien x-ghost-admin-api-key) | | x-ghost-api-version | Chaque client/utilisateur MCP (optionnel) | En-tΓͺte HTTP, par dΓ©faut v5.0 | Cet identifiant doit Γͺtre une **clΓ© Admin API d'intΓ©gration personnalisΓ©e** (la paire `id:secret` obtenue depuis Ghost Admin β†’ RΓ©glages β†’ IntΓ©grations), car c'est ce que `@tryghost/admin-api` utilise pour signer les requΓͺtes vers Ghost. Une nuance mΓ©rite d'Γͺtre soulignΓ©e : Ghost dispose aussi des **Staff Access Tokens** β€” des JWT de courte durΓ©e Γ©mis lors de la connexion d'un membre de l'Γ©quipe Γ  Ghost Admin. Ceux-ci prΓ©servent une attribution exacte par utilisateur et le respect des rΓ΄les, mais ils ne sont pas compatibles avec la bibliothΓ¨que cliente Admin API utilisΓ©e par ce serveur MCP (qui a besoin du secret brut pour signer ses propres jetons). Le modΓ¨le pratique pour un accΓ¨s Β« par personne Β» est le suivant : **chaque utilisateur crΓ©e sa propre intΓ©gration personnalisΓ©e** dans Ghost, nommΓ©e Γ  son nom, et utilise cette clΓ©. Vous obtenez ainsi une traΓ§abilitΓ© individuelle (`created_by` affiche *cette* intΓ©gration), mΓͺme si les clΓ©s d'intΓ©gration personnalisΓ©e ne respectent pas les frontiΓ¨res de rΓ΄les Ghost (Contributeur/Auteur/Γ‰diteur/Administrateur) comme le ferait une session utilisateur rΓ©elle. Une fois la clΓ© en main, tester depuis Copilot CLI tient en une ligne : ```bash copilot mcp add ghost-mcp \ --type http \ --url https://your-domain.example/ \ --header "Authorization=Bearer " \ --header "x-ghost-api-version=v5.0" \ --tools "*" ``` Une fois cela fonctionnel, le mΓͺme point d’accΓ¨s HTTP est prΓͺt Γ  Γͺtre rΓ©utilisΓ© par Microsoft 365. ## Connecter Ghost CMS dans Microsoft 365 Utiliser Copilot Studio est un moyen simple et accessible pour configurer un serveur MCP et pour pouvoir l'utiliser au travers d'un agent En prΓ©version nous avons la possibilitΓ© de faire du **Bring Your Own (BYO) MCP Server** via Microsoft Agents 365 et le CLI Agents 365 - l'ajout de ce type de fonctionnalitΓ© requiert une validation par un administrateur β€” ce sujet sera couvert dans un prochain article une fois testΓ© de bout en bout. Il existe aussi une voie via un **connecteur personnalisΓ© Power Apps** pour brancher un serveur MCP (OpenAPI + `x-ms-agentic-protocol: mcp-streamable-1.0`) dans Power Platform, que j'explorerai Γ©galement sΓ©parΓ©ment. Pour *cet* article, le chemin le plus direct et le plus rapide est **Copilot Studio**, qui dispose d'un **assistant d'intΓ©gration MCP** intΓ©grΓ©, prΓ©vu exactement pour ce scΓ©nario : connecter un agent Γ  un serveur MCP existant via Streamable HTTP. ![](https://blog.lsonline.fr/content/images/2026/08/image-19.png) Copilot - Usage d'un Agent avec un MCP personnalisΓ© ### Γ‰tape 1 β€” CrΓ©er (ou modifier) votre agent Copilot Studio Dans [Copilot Studio](https://copilotstudio.microsoft.com/?ref=blog.lsonline.fr), crΓ©er un nouvel agent (ou modifier un existant) β€” c'est cet agent qui gΓ©rera votre instance Ghost CMS et, Γ  terme, permettra d’utiliser les documents SharePoint et d’autres types de donnΓ©es. ![](https://blog.lsonline.fr/content/images/2026/08/image.png) Copilot Studio - CrΓ©er son premier agent > \[info\]Important > Lors de la crΓ©ation d'un agent, sΓ©lectionner Orchestration Standard (ne consomme aucun crΓ©dit) ou Processus Entreprise (crΓ©dits IA - GitHub Copilot) ![](https://blog.lsonline.fr/content/images/2026/08/image-16.png) Copilot Studio - Type d'agent ### Γ‰tape 2 β€” Ajouter Ghost MCP comme outil 1- Depuis le panneau de configuration de l'agent, cliquer sur **Outils (Tools)**. ![](https://blog.lsonline.fr/content/images/2026/08/image-6.png) Copilot Studio - Outils 2- SΓ©lectionner **Ajouter β†’ Model Context Protocol (MCP)**. L'assistant d'intΓ©gration MCP s'ouvre. ![](https://blog.lsonline.fr/content/images/2026/08/image-7.png) Copilot Studio - Ajouter un MCP 3- Renseigner : - **Nom du serveur** : `blog-mcp` - **Description du serveur** : quelque chose d'explicite, comme *Β« GΓ©rer le blog Ghost : crΓ©er/modifier/lire/supprimer des articles, tags, membres, newsletters, offres, webhooks, etc. Β»* L'orchestrateur utilise cette description pour dΓ©cider quand appeler le serveur, soyez donc prΓ©cis. - **URL du serveur** : `https://your-domain.example/` β€” le point de terminaison HTTPS public, accessible depuis Internet. - **Type de paramΓ¨tre** : l'identifiant Ghost Γ©tant une clΓ© Admin API statique, sΓ©lectionnez **En-tΓͺte (Header)**. *Copilot Studio ne prend en charge que le transport *Streamable HTTP* (le SSE a Γ©tΓ© dΓ©prΓ©ciΓ© en aoΓ»t 2025).* - **Nom de l'en-tΓͺte** : `Authorization` - **Valeur clΓ©**: `Bearer your-id:your-secret` ![](https://blog.lsonline.fr/content/images/2026/08/image-8.png) Copilot Studio - Formulaire d'enregistrement d'un nouveau serveur MCP 4- SΓ©lectionner **Ajouter**, puis crΓ©er une nouvelle connexion. Dans le champ **Authorization**, rΓ©pΓ©ter la **valeur clΓ©** (`Bearer your-id:your-secret`) et cliquer sur **CrΓ©er**. ![](https://blog.lsonline.fr/content/images/2026/08/image-4.png) ![](https://blog.lsonline.fr/content/images/2026/08/image-5.png) ![](https://blog.lsonline.fr/content/images/2026/08/image-20.png) Copilot Studio - Connecter le serveur MCP 5- Cliquer sur **Ajouter**. > \[note\]Note > Copilot Studio appellera `tools/list` sur le conteneur en cours d'exΓ©cution et affichera tous les outils Ghost MCP : posts, tags, members, newsletters, offers, tiers, invites, roles, users, webhooks. Vous pouvez tous les activer, ou restreindre l'agent Γ  un sous-ensemble plus sΓ»r (par exemple, seulement `posts_*` et `tags_*` si vous ne voulez pas que l'agent touche aux membres ou aux webhooks). ### Γ‰tape 3 β€” Tester dans Copilot Studio Il est possible d'utiliser la prΓ©visualisation pour essayer quelques prompts : - *Β« Liste mes 5 derniers articles en brouillon sur le blog Β»* - *Β« CrΓ©e un article en brouillon intitulΓ© 'Test de Ghost MCP depuis Copilot Studio'Β»* - *Β« Quels tags existent sur mon blog ? Β»* ![](https://blog.lsonline.fr/content/images/2026/08/image-9.png) ![](https://blog.lsonline.fr/content/images/2026/08/image-10.png) ![](https://blog.lsonline.fr/content/images/2026/08/image-11.png) Copilot Studio - PrΓ©visualisation de l'agent avec le serveur MCP Si tout est correctement connectΓ©, vous verrez l'agent appeler les outils `posts_browse`, `posts_add` ou `tags_browse` et renvoyer des donnΓ©es rΓ©elles de votre instance Ghost πŸ₯³πŸš€ ### ✨ Nouveau, Γ©tape intermΓ©diaire Il est aussi possible de lancer des tests unitaires pour Γ©valuer votre agent ! CrΓ©er plusieurs conversations et indiquer les messages attendus. Lancer l'Γ©valuation et vous obtiendrez un score: ![](https://blog.lsonline.fr/content/images/2026/08/image-12.png) Copilot Studio - Tests unitaire ### Γ‰tape 4 β€” Publier et combiner avec les donnΓ©es Microsoft 365 Une fois l'outil fonctionnel, publier l'agent sur Microsoft Teams et/ou le chat Microsoft 365 Copilot. C'est vraiment lΓ  que se trouve le bΓ©nΓ©fice : le mΓͺme agent peut dΓ©sormais aussi recevoir les connecteurs **SharePoint** et **OneDrive** (ou une source de connaissances pointant vers une bibliothΓ¨que de documents), pour pouvoir demander par exemple *Β« Prends les rΓ©sultats de tests d'aujourd'hui sur SharePoint et rΓ©dige un article qui les rΓ©sume Β»* β€” une seule conversation, un seul agent, couvrant Γ  la fois Ghost et les documents/donnΓ©es provenant de Microsoft 365 πŸš€ ![](https://blog.lsonline.fr/content/images/2026/08/image-15.png) Copilot Studio - Publier un agent Une fois publiΓ©, il sera alors possible de surveiller votre agent: - Nombre de rΓ©actions - Nombre d'utilisateurs actifs - CrΓ©dits Copilot si ce n'est pas un agent standard β€οΈπŸ™πŸ» - etc. ![](https://blog.lsonline.fr/content/images/2026/08/image-18.png) Copilot Studio - Surveillance de l'agent --- ## Et ensuite Cet article couvre une premiΓ¨re faΓ§on de mettre en place un MCP personnalisΓ© depuis Copilot Studio : Ghost MCP en mode HTTP + l'assistant d'intΓ©gration MCP de Copilot Studio. Deux articles suivront : 1. **BYO MCP Server (prΓ©version)** β€” enregistrer Ghost MCP au niveau du Tenant via le CLI Agents 365 et le centre d'administration Microsoft 365, pour qu'il soit disponible pour n'importe quel agent sans configuration additionnelle. 2. **Connecteur personnalisΓ© Power Apps** β€” encapsuler le mΓͺme point de terminaison MCP en tant que connecteur personnalisΓ© basΓ© sur OpenAPI pour des scΓ©narios Power Platform (flux Power Automate, application Power Apps). Aviez-vous dΓ©jΓ  expΓ©rimentΓ© cette solution ? Sinon, Γͺtes-vous prΓͺt Γ  essayer ? Quels sont vos cas d'usages? ### Modernizing Access Governance: Why It’s Time to Move Beyond "Everyone Except External Users" (EEEU) URL: https://blog.lsonline.fr/2026/04/20/modern-access-governance-time-to-move-beyond-eeeu/ Last updated: 2026-06-22T12:47:53.000Z For years, *Everyone Except External Users* (EEEU) has been one of the most widely used - and most misunderstood - identity constructs in Microsoft 365. It appears simple, convenient, and universal. But as organizations mature their governance, adopt Zero Trust, and refine identity hygiene, EEEU increasingly becomes a source of confusion, oversharing, and operational friction. After discussions at the Microsoft MVP Summit and real‑world cases shared in the Microsoft Tech Community, it’s clear that EEEU deserves a fresh look. Not because it’s "bad", but because it no longer aligns with the governance expectations of modern Microsoft 365 environments. Let’s break down what EEEU really is, why hiding it doesn’t disable it, where Microsoft still uses it internally, and how to transition to a cleaner, more controlled model using Entra ID Dynamic Groups. ## **What EEEU Actually Is (and What It Isn’t)** The first misconception to clear up: **"EEEU is not a SharePoint group. It is not a dynamic group. It is not a configurable identity."** EEEU is a Microsoft 365 platform-level implicit claim β€” evaluated at the identity/token layer across services (SharePoint, Teams, Power Platform) β€” that is not managed as a discrete Entra ID object. At runtime, it resolves to: - All **internal users** (`userType = Member`) - Many **non‑human identities** (service accounts, room mailboxes, resource accounts) - Both **licensed and unlicensed** cloud users It is *not*: - A governance boundary - A least‑privilege construct - A lifecycle‑managed identity - A reliable representation of "employees only" This is why so many admins are surprised when EEEU includes accounts they never intended to expose content to. ![](https://blog.lsonline.fr/content/images/2026/04/modern-access-governance-time-to-move-beyond-eeeu-EEEU.drawio-2.png) EEEU Claim constitution > \[info\] Important > > β€’ B2B guests (userType = Guest) are excluded from EEEU by design β€” that's the whole point of "Except External Users" > β€’ However, mis-provisioned accounts (guests promoted to Members, or accounts with incorrect userType) can end up included ## **Hiding EEEU Does *Not* Disable It** Many organizations run the following to reduce accidental use: ```PowerShell # Hides EEEU from SharePoint permission pickers and sharing dialogs Set-SPOTenant -ShowEveryoneExceptExternalUsersClaim $false ``` SharePoint PowerShell cmdlet ```PowerShell # Prevents EEEU from being assigned on private M365 Group-connected sites Set-PnPTenant -AllowEveryoneExceptExternalUsersClaimInPrivateSite $false ``` PnP PowerShell cmdlet This is a good governance practice - but it only hides the claim from: - SharePoint permission pickers - Sharing dialogs - Site owner UI It does **not**: - Remove the claim - Disable the claim - Prevent token issuance - Stop developers from assigning it programmatically - Prevent Microsoft 365 features from being used internally This is the most important point for architects: > \[info\] **Important** > > Hiding EEEU prevents accidental use - it does not eliminate the identity. ## **Why Microsoft Still Uses EEEU Internally** This is where the MVP Summit insights matter. Microsoft continues to use EEEU internally because it provides: - A **tenant‑wide identity** - That is **always present** - That does not depend on customer configuration - That works even if dynamic groups are misconfigured or unlicensed Examples include: | Org‑wide Teams | Org‑wide Teams automatically include all internal users β€” powered by the same identity logic as EEEU. | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | Viva Engage / Viva Connections | Some experiences require a universal internal audience. | | SharePoint system sites | Certain service‑level constructs rely on EEEU for baseline access. | | Microsoft 365 apps requiring "all users" access | These apps cannot rely on customer‑managed groups. This is why EEEU will never fully disappear - but that doesn’t mean you should use it for governance. | > \[note\] Information > > With the adoption of Copilot for Microsoft 365, EEEU-based oversharing is no longer a passive risk. Copilot surfaces content through semantic search and grounding - content that a user technically has access to (even via EEEU) can now be retrieved and summarized without that user ever having consciously navigated to it. EEEU-wide permissions become an immediate, active exposure vector. ## **Governance Risks of Using EEEU** Using EEEU in modern environments introduces several risks: | Oversharing | EEEU includes identities you may not expect - including service accounts and resource mailboxes. | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | | Licensing Side Effects | A real example from the TechCommunity: EEEU caused Teams Phone licensing evaluations for accounts that should never be licensed. | | No Lifecycle Control | You cannot: Exclude departments Exclude resource accountsExclude automation accounts Apply HR‑driven logic Apply conditional access segmentation | | Zero Trust Misalignment | EEEU is the opposite of least privilege. | | No Auditing or Membership Visibility | You cannot see who is included β€” because it’s not a group. | ## **Real‑World Example: Teams Phone Licensing Noise** In my TechCommunity answer, I explained a case where EEEU unexpectedly included: - Teams Phone resource accounts - Admin accounts - Non‑human identities This triggered licensing evaluations and created confusion for administrators. This is a perfect example of why EEEU is not suitable for controlled environments. ## **The Modern Approach: Replace EEEU with Dynamic Groups** The recommended governance pattern is that once you have hidden the EEEU claim, you can use the Dynamic Security Group instead ``` (user.accountEnabled -eq true) -and (user.userType -eq "Member") ``` This gives you: - Full control - Full auditability - Full lifecycle alignment - Zero Trust compatibility - Predictable behavior You can refine the rule using: - Department - Company - Custom attributes - HR-driven attributes - Exclusions for resource accounts > \[success\] Tip > > Think about excluding service account as well as admins and any kind of account that is not "human". > > Service accounts: `-and -not (user.userPrincipalName -startsWith "svc.")` > Admin accounts: `-and -not (user.userPrincipalName -contains "-adm@")` ![](https://blog.lsonline.fr/content/images/2026/04/modern-access-governance-time-to-move-beyond-eeeu-ENTRAGRP.drawio-1.png) Dynamic Group Management ## **Comparison Table: EEEU vs Dynamic Groups** | Capability | EEEU | Dynamic Group | | ---------------------------- | ---- | ------------- | | Filterable membership | No | Yes | | Exclude service accounts | No | Yes | | Align with Zero Trust | Poor | Strong | | Lifecycle control | None | Full | | Visibility / audit | None | Full | | Used by Microsoft internally | Yes | No | | Recommended for governance | No | Yes | | Graph API queryable | No | Yes | ## **Conclusion** EEEU is not going away β€” and it still plays an important role inside Microsoft 365\. But for governance, security, and lifecycle management, it’s time to move beyond it. EEEU served its purpose in a simpler era β€” but modern Microsoft 365 governance demands identities you can see, control, and audit. Dynamic groups give you exactly that - this is the modern, future‑proof approach to tenant‑wide access governance. --- *References:* - [*Monitor 'Everyone except external users' (EEEU) sharing with the EEEU activity report*](https://learn.microsoft.com/sharepoint/data-access-governance-everyone-except-external-user-report?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) - [*"Everyone except external users" group is removed on Microsoft 365 private group website*](https://learn.microsoft.com/troubleshoot/sharepoint/sharing-and-permissions/everyone-except-external-user-removed?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) - The OneDrive EEEU Removal (MC1013464) β€” Completed by Sept 30, 2025 - [*SharePoint Visitor Permissions Group - Teams Phones License*](https://techcommunity.microsoft.com/discussions/sharepoint%5Fgeneral/sharepoint-visitor-permissions-group---teams-phones-license/4491810/replies/4499993?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) Hoping this post will help you πŸ™‚ ### Manage Mail-Contacts from Power Automate URL: https://blog.lsonline.fr/2025/12/01/exo-mail-contacts-from-pa/ Last updated: 2026-06-22T12:48:34.000Z You are a system administrator, a developer, security system, or someone interesting in the identity management into Microsoft 365, and you need more information about the Microsoft contacts, this post can afford you some inputs. Among the different identity management, there is still another kind of user information in Microsoft 365\. You basically have: - **Members**: standard user accounts generally assigned a Microsoft 365 license - **Guests**: external users of the organization (Work & School, Live, Gmail, etc.) [B2B guest user properties - Microsoft Entra External IDLearn about the properties of a B2B guest user in Microsoft Entra External ID. Understand user types, authentication methods, and how to manage guest user access and permissions.![](https://learn.microsoft.com/favicon.ico)Microsoft Learncsmulligan![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/entra/external-id/user-properties?ref=blog.lsonline.fr#user-type?wt.mc%5Fid=MVP%5F386670) You have another kind of users information: contacts and mail contacts. Compared to the Members and Guests, the contacts cannot sign in into your environment and no role or permission can be assigned to them. The contacts are not accessible from Entra ID and they are mail-enabled objects that contain information about people who exist outside your organization; they can be managed only from Microsoft Exchange. - **Contacts**: are managed by the users from their Outlook (Exchange) accounts. The contacts are personal and can be shared to colleagues. - **Mail-contacts**: are managed by the Exchange administrator. They can be managed only from the admin interfaces (Admin Center and Exchange Admin Center - EAC) or PowerShell. A significant difference between the user contacts (user mailbox) can be managed via Outlook and Microsoft Graph API. Mail-contacts, however, cannot be managed this way. There is not really a choice here. If you want to maintain for your whole organization a contact list you can: - create a script to update a Shared Contact list - the list must be shared to all users (Members). - create a script to create a list and update the contacts into all mailboxes of your Tenant. - create mail-contacts into your Exchange instance and visible from the Global Address List (GAL) The two first methods and not recommended; the script can become complex challenge to maintain and it can take a lot of time to update the contacts list. These methods are conceivable only if you want to shared some contacts to specific people in your organization. **Shared Contact Lists** are not scalable for enterprise scenarios. The third method is more appropriate for whole of your organization (Tenant) because is simpler and more maintainable over time. The two first method are quite easy to implement because you have Microsoft Graph API, that is not the case for the mail-contacts. This is where this post adds value. You can use PowerShell to automate the actions. The downside is that you’ll need to script and create a runner somewhere (Windows tasks, Azure Function, any kind of solution that support PowerShell). In this post, we will use Exchange Admin API to use Power Automate directly πŸš€ ## Connector > \[*warning*\] Warning > Exchange API does not work with the HTTP Request with Entra (preauthorized). [Microsoft Entra ID - Connectors![](https://learn.microsoft.com/favicon.ico)Microsoft Learnmiriver![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/connectors/azuread/?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2025/12/Screenshot-2025-12-01-130053.png) HTTP with Microsoft Entra ID connector - New connection reference To be able to use it for the mail-contacts context, you will need to define the origin URL:`https://admin.microsoft.com/` > \[Note\] Note > The new Microsoft URL does not work yet: `https://admin.cloud.microsoft/` ## API ### Get Contacts ```HTTP POST https://admin.microsoft.com/admin/api/Contact/GetContacts Body { "SearchString": "", "NextLink": "" } ``` > \[Note\] Note > The `SearchString` property is not a full text search - it has the same behavior than `startWith()`. > The search is based on Contact Name or Email properties. ### New Contact ```HTTP POST https://admin.microsoft.com/admin/api/Contact Body { "ContactLastName": "Doe", "ContactExternalEmailAddress": "john.doe@contoso.com", "ContactWebPage": "https://contoso.com", "ContactMailTip": "Johnny", "ContactMobilePhone": "", "ContactHiddenFromAddressListsEnabled": true, "ContactDisplayName": "John Doe", "ContactPhone": "", "ContactTitle": "Sale", "ContactFirstName": "John", "selected": false, "ContactCompany": "Contoso", "ContactFax": "" } ``` In this case, some properties such as Company, or Hidden From Address List didn't work during the creation. But, after using the update API, it was possible to change these information. ### Update Contact Information (General) ```HTTP PUT https://admin.microsoft.com/admin/api/Contact Body { "ContactStreetAddress2": null, "ContactLastName": "LastName", "ContactStreetAddress3": null, "ContactExternalEmailAddress": "user@contoso.com", "ContactWebPage": "https://contoso.com", "ContactDomain": null, "ContactStateOrProvince": "", "ContactMailTip": null, "ContactEmailAddresses": null, "ContactCity": "", "ContactName": "FullName", "ContactMobilePhone": "", "ContactHiddenFromAddressListsEnabled": false, "ContactCountryOrRegion": { "DisplayName": "", "LocalizedDisplayName": "" }, "ContactPhoneticDisplayName": null, "ContactDisplayName": "FullName", "ContactPhone": "", "ContactInitials": null, "ContactAlias": null, "ContactStreetAddress": "", "ShowLastNameFirst": false, "ContactDepartment": null, "ContactSmtp": null, "ContactPostalCode": "", "ContactTitle": "Job Title", "ContactSimpleDisplayName": null, "ContactId": "d4c0b5aa-d484-4e5a-ae89-1b13afc7a86a", "ContactFirstName": "FirstName", "selected": false, "ContactOffice": null, "ContactCompany": "Contoso", "IsDirSynced": false, "ContactFax": "", "EditExchangeSettingsUrl": "https://admin.exchange.microsoft.com/?landingpage=contacts/:/ContactDetails/mailContact/d4c0b5aa-d484-4e5a-ae89-1b13afc7a86a&form=mac_sidebar", "ShowZipCodeFirst": false } ``` Note that the following properties are really important: - ContactId - EditExchangeSettingsUrl ### Update Contact Settings ```HTTP PUT https://admin.microsoft.com/admin/api/Contact/options Body { "ContactStreetAddress2": null, "ContactLastName": "Doe", "ContactStreetAddress3": null, "ContactExternalEmailAddress": "john.doe@contoso.com", "ContactWebPage": "", "ContactDomain": null, "ContactStateOrProvince": "", "ContactMailTip": "Johnny", "ContactEmailAddresses": null, "ContactCity": "", "ContactName": "John Doe", "ContactMobilePhone": "", "ContactHiddenFromAddressListsEnabled": true, "ContactCountryOrRegion": { "DisplayName": "", "LocalizedDisplayName": "" }, "ContactPhoneticDisplayName": null, "ContactDisplayName": "John Doe", "ContactPhone": "", "ContactInitials": null, "ContactAlias": null, "ContactStreetAddress": "", "ShowLastNameFirst": false, "ContactDepartment": null, "ContactSmtp": null, "ContactPostalCode": "", "ContactTitle": "", "ContactSimpleDisplayName": null, "ContactId": "fe1ef0a3-ca7f-404a-af18-b91695e15519", "ContactFirstName": "John", "selected": false, "ContactOffice": null, "ContactCompany": "", "IsDirSynced": false, "ContactFax": "", "EditExchangeSettingsUrl": "https://admin.exchange.microsoft.com/?landingpage=contacts/:/ContactDetails/mailContact/fe1ef0a3-ca7f-404a-af18-b91695e15519&form=mac_sidebar", "ShowZipCodeFirst": false } ``` Hoping this post will help you πŸš€ ### Configure your local Let's Encrypt solution URL: https://blog.lsonline.fr/2025/11/10/configure-your-local-lets-encrypt-solution/ Last updated: 2026-06-22T12:50:22.000Z You are a developer, someone with a "homelab" that offers services, or a security administrator, and you want to implement HTTPS security? You can manually create a Root CA and then generate certificates when you need a new one. In my case, I wrote a procedure to not forget the command lines, but I was a little bit bored doing the same things each time I need a new certificate, because I have to: - Retrieve the Root CA - Retrieve my documentation - Create the configuration file - Execute commands to generate the new certificate - Drop the certificate on my reverse proxy or server directly You may have heard about Let’s Encrypt - it is an amazing solution to generate certificates on demand and automatically. Unfortunately, it won’t issue certificates for private domains (e.g., .home, .lab, .local, etc.). I was frustrated because I am using [Nginx Proxy Manager](https://nginxproxymanager.com/?ref=blog.lsonline.fr), which works only with Let's Encrypt to generate and renew certificates. So how can we get the same **automatic certificate management** experience, but fully local πŸ’ͺ I decided to invest time in finding a way to reproduce the Let's Encrypt behavior without a script, manual renewal, and all of this, locally. ![](https://blog.lsonline.fr/content/images/2025/09/image-5.png) Infrastructure overview ## Network Network: 192.168.0.0/24 Router/Gateway: 192.168.0.1 DNS: 192.168.0.250 NPM: 192.168.0.220 LabCA: 192.168.0.200 ## LabCA > \[info\] Important > Your LabCA instance must have a static IP Address in your network. To generate a certificate "on the fly", you can build your own stack with all required services... If you want to use a solution that provides a similar service to Let's Encrypt, you can use [LabCA](https://lab-ca.net/?ref=blog.lsonline.fr). As explained on the website of the solution, LabCA is: "*A private Certificate Authority for internal (lab) use, based on the open source ACME Automated Certificate Management Environment implementation from Let’s Encrypt (tm).*" What I appreciate most about this solution: - User web interface - it is easy to download the Root CA from any device. - Admin web interface - keep an eye on the issued certificates. - Don't need to have deep knowledge of ACME, Boulder, and other services and configurations. - It's quite easy to set up - Docker Compose + wizard configuration. > \[info\] Important > You cannot run the Docker stack on a Raspberry Pi because of boulder. > It is possible to switch Boulder by [step-ca](https://github.com/hakwerk/labca/blob/master/README%5Fstandalone.md?ref=blog.lsonline.fr). Some additional configuration must be performed, and we will see that in the next steps. ## Reverse Proxy > \[info\] Important > Your Reverse Proxy server must have a static IP Address in your network. A Reverse Proxy is one of the most important parts of the infrastructure. There are a couple of solutions, but not all of them support Let's Encrypt SSL. Of course, you can secure your application directly by depositing the certificates, but you have to connect to each of them and configure the SSL (if supported). Using a reverse proxy allows for one place that redirects the network flows and allows for encryption of the communication. I choose to use [Nginx Proxy Manager](https://nginxproxymanager.com/?ref=blog.lsonline.fr) because the solution provides a friendly admin web interface. NPM requires manual configuration of the Proxy Hosts and can be used for everything. If you are essentially using Docker containers, and you want to automate everything, you can use [letsencrypt-nginx-proxy-companion](https://github.com/jwilder/docker-letsencrypt-nginx-proxy-companion?ref=blog.lsonline.fr) \+ [jwilder/nginx-proxy](https://github.com/ayufan-research/jwilder-nginx-proxy?ref=blog.lsonline.fr) \- this solution looks more secure because you don't have to expose the admin interface, and by simply adding environment variables to your Docker Compose, the proxy hosts are configured as well as the certificates. ## DNS Whatever your DNS server, at least you can configure a custom DNS response, it's ok 😁 I just focused on [AdGuard Home](https://adguard.com/en/adguard-home/overview.html?ref=blog.lsonline.fr), which is a great alternative to [Pi-Hole](https://pi-hole.net/?ref=blog.lsonline.fr). AdGuard Home offers a friendly admin interface, easy to maintain, that does not require advanced skills to configure and secure your home network. I ❀️ it for the following reasons: - Polished web interface - Once configured as a DHCP server, you can control all of your devices - DNS rewrite feature (an important feature in our use case) - Blacklist - there are a couple of lists provided by the community - Built-in DNS encryption - Flexible parental control (if you have kids) > \[note\] Note > In this case, ADGuard Home is configured as DHCP server as well. ## Set up ### Your local domain Your DNS server must be configured to ensure the root domain is reachable. If your domain name is `.home`, `.lab`, `.my`, etc., you must add an **A** (IPv4) or an AAAA (IPv6) record. My suggestion is to use your DNS server IP address. ```DNS A home 192.168.0.250 ``` `home` replace it with your local domain name. `192.168.0.250` replace it with your DNS server IP address. ### Install and configure your LabCA Configure your DNS server to create a LabCA FQDN: ```DNS A labca.home 192.168.0.220 ``` `labca.home` replace it with your LabCA FQDN. `192.168.0.220`replace it with your **NPM server IP address**. Edit Docker Compose at the nginx service to update the port like this: ```diff nginx: image: nginx:latest restart: always networks: - bouldernet - npm-network ports: - - 80:80 + - 5080:80 - - 443:443 + - 5081:443 volumes ``` LabCA Docker Compose file ### Configure your NPM Your reverse proxy must trust your certificate authority (LabCA), and it must serve the full chain ( `cert.pem` \+ `intermediate.pem` \+ `root.pem`) to avoid browser errors. To be able to communicate and generate certificates, you must provide the Boulder Root CA. From the Boulder container, retrieve the `minica.pem` certificate: ```bash /opt/boulder/labca/certs/ipki/minica.pem ``` Then, drop the certificate into your reverse proxy (I changed the extension of the file): ``` /usr/local/share/ca-certificates/minica.crt ``` > \[*info*\] Important > If you have updated your container, you will need to reconfigure the certificate. > \[success\] Tip > Bind a persistent certificate file or folder to not have to copy it again. Now, you must update the reverse proxy certificates ```bash update-ca-certificates ``` Currently, your FQDN `labca.home` is redirected to your NPM server. It is necessary to create a new host to redirect `labca.home` to your LabCA server: ```DNS Domain Names: labca.home Scheme: https Forward Hostname / IP: 192.168.0.200 Forward Port: 5081 ``` ![](https://blog.lsonline.fr/content/images/2025/10/image-5.png) ### Override NPM That is the funniest part of the setup πŸ˜‰ From your DNS server, rewrite Let's Encrypt API URL and generate a custom certificate - https://acme-v02.api.letsencrypt.org ⟢ https://labca.home > \[info\]Important > In my case, I choose the rewrite the Let's Encrypt ACME URL for my whole local network (not just the NPM server). > Thanks to this, I can use my local ACME server for other services or devices to generate certificates (ex: Synology NAS, local developments from my computer, etc.). > > If you want only NPM server impacted, edit the `/etc/hosts` of your NPM server only. Then, from the NPM, create a new Proxy Host: ![](https://blog.lsonline.fr/content/images/2025/10/image-4.png) Configure custom locations - /directory ⟢ http://192.168.0.200/directory:5081 - /acme ⟢ https://192.168.0.200/acme:5081 ![](https://blog.lsonline.fr/content/images/2025/10/image-6.png) Let's Encrypt ACME custom locations ### SSL The Boulder server has a script that is used to generate the basic certificates required for the system run. As explained in the *README.md*, you can edit this file to generate additional certificates on the same configuration as the certificates that will be generated automatically. Edit the file `/opt/boulder/labca/certs/generate.sh`, and add the line below to the `ipki()`Function: ```Diff # background without racing to create it. minica -domains localhost --ip-addresses 127.0.0.1 + # Create a local Let's Encrypt cert which can be used by NPM to simulate the endpoint + minica -domains "acme-v02.api.letsencrypt.org" # Used by challtestsrv to negotiate DoH handshakes. Even though we think of ``` You can try to launch `generate.sh` but in my case, the Let's Encrypt certificates were not generated. So, I chose to move the `ipki` folder to `ipki.prev` and reboot the LabCA stack to enforce a new generation. Once done, retrieve your new Let's Encrypt certificate located in the folder `acme-v02.ap.letsencrypt.org` and add it to NPM to configure SSL for your local `acme-v02.ap.letsencrypt.org`. SSL Certificates ⟢ Add SSL Certificate ⟢ Custom ![](https://blog.lsonline.fr/content/images/2025/10/image.png) ![](https://blog.lsonline.fr/content/images/2025/10/image-1.png) Configure local Let's Encrypt SSL from NPM **Enjoy your Local Let's Encrypt** πŸš€β­ ## User Devices Connect to your LabCA web interface and download the Root CA. Then, install and trust the certificate on your devices. This step is required for your devices to recognize the Private Trusted Certificates. ### MAC OS Install the certificate into your system directly from Finder (double clicks) or from Keychain Access by importing it. Once imported, from Keychain Access, open the certificate and choose to Always Trust it. ![](https://blog.lsonline.fr/content/images/2025/11/image-1.png) ### Windows Download the certificate, change the extension file to `.crt`, then you can follow the Microsoft documentation: [Trusted Root Certification Authorities Certificate Store](https://learn.microsoft.com/windows-hardware/drivers/install/trusted-root-certification-authorities-certificate-store?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). > \[success\] Tips > If your browser was open during the procedure and you still have an untrusted certificate, ensure closing all windows and open it again. ### iOS Download and install the certificate from Safari (other browsers do not allow the installation of certificates). Once installed, go to *Settings ➝ General ➝ VPN & Device Management ➝ Configuration Profile*, select your Root CA ➝ click on Install. ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1228.jpg) ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1227.jpg) ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1226.jpg) ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1229.jpg) ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1230.jpg) ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1232.jpg) Install iOS self-trusted certificate Now, you have to trust it, go to *Settings ➝ General ➝ About ➝ Certificate Trust Settings ➝* Click on the toggle at the right of the Root CA. ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1233-1.jpg) ![](https://blog.lsonline.fr/content/images/2025/11/IMG_1235-1.jpg) Trust self-trusted certificate on iOS Now, all of your devices can connect to your services, apps, etc., with a green lock. Hoping this post will help you πŸš€ ### Create SharePoint Page from Power Automate without Graph API URL: https://blog.lsonline.fr/2025/11/07/create-sp-page-from-pa-without-graph-api/ Last updated: 2026-06-22T12:50:51.000Z Microsoft is still implementing new capabilities to Microsoft Graph API - Microsoft Graph API is a standard. In some cases, Microsoft Graph API cannot be used because of: - Lack of capabilities - Organizational governance can sometimes be too complicated for a simple use case - permissions too large (not enough scoped for security) - In Power Automate, using Microsoft Graph connector often requires a Premium license. This can be a blocker for simple use cases. If you are looking for full documentation and still stuck to the standard, you should use Microsoft Graph API as much as possible. For this use case, to manage a SharePoint page, Microsoft Graph API provides an API to do this. We recommend using it except for the reason above or other reasons. So yes, you can create modern Site Pages with the SharePoint REST "SitePages" API **without** Microsoft Graph API. > \[success\] Tip > At the date of this blog post, SharePoint is not using Graph API to create page - SharePoint is using his own API. | Key point | Microsoft Graph API | SharePoint API | | ---------------------------- | ------------------------------------------------------------------ | -------------------------------------------------------------- | | Permissions | Requires Entra App registration & Tenant consent | Using existing SharePoint API with account context permissions | | Complexity | Medium (regarding on org governance) | Low - just reuse API | | Governance | Harder to audit and approvals | Easier and align with the SharePoint site level permissions | | Documentation | Microsoft and community documentation | Limited documentation | | Power Automate compatibility | HTTP Request Premium action (HTTP With Microsoft Entra ID or HTTP) | Send an HTTP Request to SharePoint (free) | > \[Note\] Note > All the following request examples where performed with the Power Automate "Send a SharePoint HTTP request" connector. ## Create Page ### Endpoint ```HTTP POST /_api/sitepages/pages ``` Create SP page API ### Headers ``` Accept: application/json;odata=verbose Content-Type: application/json;odata=verbose ``` Create SP page header ### Body (minimal) ```Json { "__metadata": { "type": "SP.Publishing.SitePage" }, "PageLayoutType": "Article", "PromotedState": 0 } ``` Create SP page body - `PageLayoutType` : one of **Article**, **Home**, **SingleWebPartAppPage**. (These are the three modern layouts.) - `PromotedState`: **0** \= regular page, **1** \= news (draft), **2** \= **published** news post. (You can also promote with a separate action) - The '**\_\_metadata.type'** must be **'SP.Publishing.SitePage'** for modern pages. > \[note\] Note > You mentioned using `{ "PageLayoutType": "Article", "CreationMode": 2 }`. > CreationMode isn’t documented publicly for Site Pages and isn’t required β€”many implementations omit it and rely on `PageLayoutType/PromotedState` \+ `SavePage/Publish` calls. ![](https://blog.lsonline.fr/content/images/2025/11/image.png) Screenshot of the Send an HTTP request to SharePoint action configuration ## Edit Page After creation, the response contains the page **Id**. Use it to save content: ### Endpoint ```HTML POST /_api/sitepages/pages({Id})/SavePage ``` Edit SP page API > \[note\] Note > Use `SavePageAsDraft` if you prefer to keep it as a draft first. ### Body (typical) ```JSON { "__metadata": { "type": "SP.Publishing.SitePage"}, // Title area (a.k.a. page header) "LayoutWebpartsContent": "[{ \"id\":\"cbe7b0a9-3504-44dd-a3a3-0e5cacd07788\", \"properties\": { \"title\": \"My Title\", \"imageSourceType\": 2, \"layoutType\":\"CutInShape\" }, \"serverProcessedContent\": { \"imageSources\": { \"imageSource\": \"/sites/contoso/SiteAssets/SitePages/banner.png\" } } }]", // Main canvas (controls + web parts) "CanvasContent1": "[{ \"controlType\":4, \"innerHTML\":\"

Hello

Welcome!

\", \"position\": { \"zoneIndex\":1, \"sectionIndex\":1, \"controlIndex\":1, \"sectionFactor\":12, \"layoutIndex\":1 } }]", // Common fields "Title": "My Title", "TopicHeader": "Topic", "AuthorByline": [], "BannerImageUrl": "/sites/contoso/SiteAssets/SitePages/banner.png" } ``` Edit SP page body - This is the **exact pattern Microsoft’s page editor uses** under the hood. The most reliable way to build these payloads is to create a sample page in the UI, hit **Save as draft**, and capture the **SavePage** or **SavePageAsDraft** request payload in your browser dev tools, then reuse/adapt it. - `CanvasContent1` is the JSON **serialized** structures representing of **control/web‑part** for the page body. You can update it via `SavePage`/`SavePageAsDraft`. - `LayoutWebpartsContent` configures the **Title Area** (banner/header). - You can also set `**BannerImageUrl**` (some flows do), but updates to the title area are most consistent through `LayoutWebpartsContent`. > \[note\] Note > If you try changing `BannerImageUrl` through the list item route you’ll likely hit β€œparameter does not exist” type errorsβ€”stick to the SitePages API. > \[*success*\] Tip > Tip on headers: using `application/json;odata=verbose` and including `X-RequestDigest` avoids common `__metadata`/deserialization errors in SharePoint Online. ## Publish age ```HTTP POST /_api/sitepages/pages({Id})/publish ``` Publish SP page API (Body can be just the `__metadata` object) - This publishes the latest version of the page. ## Promote to News (optional) You can **either** set `PromotedState: 2` when saving/publishing (news & published) **or** calling the explicit action: ```HTTP POST /_api/SitePages/Pages({Id})/PromoteToNews ``` Promote SP page as news API > \[note\] Note > The page must be published before to be promoted as news. ## β€œAll the payload options” you’ll most likely care about There isn’t a single canonical doc listing every property you can post with `/_api/sitepages/pages`. In practice, the payload is a mix of: - The fields on the Site Pages list item - Title - Description - BannerImageUrl - TopicHeader - PromotedState - PageLayoutsType - etc. - Modern page models (editor serialization) - CanvasContent1 - LayoutWebPartsContent - etc. **Frequently used properties at create/save time** - PageLayoutType - Article - Home - SingleWebPartAppPage - PromotedState - 0: regular page - 1: news (unpublished) - 2: news (published) - Title: page title (page by default) - Description - TopicHeader - AuthorByline - BannerImageUrl - CanvasContent1: contains sections, columns, web parts - LayoutWebpartsContent: this is the header schema - image layout type - gradient - authors display - etc. **Other properties you’ll see in responses (not all are settable)** - AbsoluteUrl ? - FileName - Path.DecodedUrl ? - Id ? - UniqueId ? - Version - VersionInfo ? - IsPageCheckedOutToCurrentUser ? - FirstPublished ? - IsWebWelcomePage - etc. (GET page will show you all metadata) ``` GET /_api/sitepages/pages({Id}) ``` Get SP page metadata ## Useful operations you’ll likely need - **Check out**: `POST /_api/SitePages/Pages({Id})/CheckoutPage` - **Save draft**: `POST /_api/SitePages/Pages({Id})/SavePageAsDraft` - **Publish**: `POST /_api/SitePages/Pages({Id})/publish` - **Promote to news**: `POST /_api/SitePages/Pages({Id})/PromoteToNews` Hoping this post will help you πŸš€ ### Keeping Power Automate Connections Alive URL: https://blog.lsonline.fr/2025/09/16/keeping-power-automate-connections-alive/ Last updated: 2026-06-22T12:52:02.000Z As a Citizen Developer or Champion on the Power Platform, you are aware that the connections are the lifeblood of Power Automate. They enable your flows to interact with SharePoint, Outlook, Dataverse, and numerous other services. But if you’ve worked with Power Automate long enough, you’ve probably seen this dreaded message: **β€œYour connection is not authenticated. Please sign in again.”** ## Why Do Power Automate Connections Disconnect? As mentioned in the Microsoft documentation, "[Troubleshoot broken connections in Microsoft Power Platform](https://learn.microsoft.com/troubleshoot/power-platform/power-automate/connections/troubleshoot-broken-connections?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr)", there are a couple of reasons why the Power Automate connections stop working, even if you didn’t change anything: - Password changes or expirations: password expired or user forgot their password and needs to renew it - Enable / Disable MFA: Changing the security settings can require reauthentication on existing sessions - Token expiration (due to inactivity): Some connectors (like SharePoint) require activity at least once every 90 days. If unused, the refresh token expires. - Microsoft Entra ID policy changes: Conditional Access, MFA requirements, or security updates can invalidate existing tokens. - Account disabled or deleted: if the solution is using a user account that was disabled or left the company - Tenant or admin actions: DLP, licensing, disable applications, ... - Timeout or network issues ## What are the solutions to avoid disconnect? Short answer: It is not possible to enforce a persistent connection 🀯 You can avoid disconnection by following some basic prerequisites: - Using a service account with a password that never expires (except for Dataverse, using a Service Principal is not supported by the most common connectors) - Configure the maximum token lifetime (90 days) - Ensure activity with the connectors that are using the connections - Configure a DLP for these accounts so that they are not impacted by the organization's security policies None of this information can avoid a disconnection. Even if we cannot avoid it, we can monitor the connections and be aware when a connection is disconnected, and prevent disconnections based on the last connection and the token lifetime. This is the subject of this blog post: provide a solution to monitor your connections. ## An agent to monitor your connections In this case, the definition of an **agent** is: *A lightweight Power Platform solution (flows, apps, or components) installed in an environment that runs on a schedule or trigger to *check the health of connections* and *report their status* to a central location (like a SharePoint list).* - **Embedded**: It lives inside the same environment as the flows and connections it monitors - **Autonomous**: It runs automatically without manual intervention (e.g., daily) to query the list of connections - **Observer role**: It doesn't fix the connection, but it allows reporting the statement of the valid connections, expired, or requiring reauthentication - **Reporter**: sends the information (e.g., connection name, owner, status, last modified date, etc.) to a centralized "database" (e.g., SharePoint list) - **Extensible**: The agent can do more than just monitor connections (e.g., environment version, custom connectors, networking, etc.) > This solution can be a complement to the [CoE Starter Kit](https://learn.microsoft.compower-platform/guidance/coe/starter-kit?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) and should not replace it. It is a solution that provides a proactive visibility on specific information. Here, the final result of the agent that pushes formatted information into a SharePoint list: ![](https://blog.lsonline.fr/content/images/2025/09/image.png) List of Power Automate connection in SharePoint list - Display the icon of the connection type - Display a badge that matches the connection status (connected, connected for more than 80 days, disconnected) - Each icon is clickable and opens the detail page of the connection to facilitate the reauthentication Here is how the flow is working: ![](https://blog.lsonline.fr/content/images/2025/09/image-2.png) Flowchart of the Power Automate Agent Flow Are you in a hurry to create this agent in your environment? Let's go πŸ€“ ## Create the Agent ### SharePoint list SharePoint can be a good choice to store the connection status: - Easy to use - Easy to configure - No need for a premium connector - No need to create an interface (use SharePoint list view) In this simplified case, the only thing you need is: - A SharePoint site (e.g., /sites/msnd) - Create a SharePoint list (e.g., servicehealth) - Add a list column - Internal name: **servicehealthconnectionhtml** - Type: **Multiple lines of text** - Required: **No** - Enhanced rich text: **Enabled** - Append Changes: **Disabled** ## Power Automate It is not required, but I recommend to create a Power Platform solution that will contain the Power Automate Flow. Here's the step-by-step process: - From **Power Platform**, create a new **Scheduled Cloud Flow** - Name: `healthservice` - Frequence: 1 per days at 6 AM for example - Add a "Initialize Variable" action: - Name: `ConnectionString` - Type: `String` - Value: (leave empty) - Add a "List My Connections / Power Automate Management" action: - Environment: (select your environment) - Add a "For each" condition: - Action: `outputs('List My Connections')?['body/value']` - Add into the foreach a "Append to string variable" action: - Name: `ConnectionString` - Value (copy/paste directly the HTML): ```html
@{if(equals(items('For_each')?['properties']?['statuses']?[0]?['status'], 'Error'), 'βœ•', if(and(not(equals(items('For_each')?['properties']?['statuses']?[0]?['status'], 'Error')), greater(div(sub(ticks(utcNow()), ticks(items('For_each')?['properties']?['lastModifiedTime'])), 864000000000), 80)), 'β“˜', 'βœ“'))}
``` > Rather than creating an HTML body, I already try to use the SharePoint column JSON format, but the JSON is to complex to be used directly into a SharePoint field. - After the foreach, add a "Create item" action: - Site Address: `https://contoso.sharepoint.com/sites/msnd` - List Name: `servicehealth` - servicehealthconnection: `@{variables('ConnectionString')}` - Click **Save** Your workflow should look like: ![](https://blog.lsonline.fr/content/images/2025/09/image-3.png) Power Automate simplified Agent Flow Test your workflow and enjoy the result βœ… ### Explanations Rather than creating an HTML body, I already tried to use the SharePoint column JSON format, but the JSON is too complex to be used directly in a SharePoint field. The current simplified flow does not require any premium or admin account. ## Next steps - Use the "List My Environments" action first to determine the current one. Thanks to this, you don't have to edit the flow into each targeted environment. - Use the "Get Connections as Admin" (Power Apps for Admins) instead of "List My Connections" to retrieve ALL connections, including established ones with another account. You will not be limited to the current user context, but this action requires an account with the Power Platform admin role. - Add additional monitoring controls to check networking, errors, etc. --- Connections will always be fragile, but with a simple monitoring agent, you can stay ahead of failures and keep your automations alive. How are you monitoring your connections today? If you try this agent, let me know how it works in your environment ❀️ Hoping this post will help you πŸš€ ### Monthly SharePoint News Digest - June 2025 URL: https://blog.lsonline.fr/2025/06/18/202506-msp-news/ Last updated: 2026-06-20T22:01:12.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - July 3rd - GitHub Copilot Bootcamp in Montreal ## πŸ’‘ Trick & Tips Migrating your local desktop content or network one to SharePoint / OneDrive cannot be so easy. There are some constraints, such as: - File path should not exceed 266 chars - File name begins with a space - File name cannot contain some special chars - etc. You can find all of these constraints/restrictions here: [Restrictions and limitations in OneDrive and SharePoint](https://support.microsoft.com/office/restrictions-and-limitations-in-onedrive-and-sharepoint-64883a5d-228e-48f5-b3d2-eb39e07630fa?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). If you have a large number of files or multiple migrations to plan, it can be complicated to manage them. The best way is to use a tool to do it for you, which one? You can use a lot of solutions in the market, but you should consider beginning with a Microsoft one, which is free and really useful: [SharePoint Migration Tool (SPMT)](https://learn.microsoft.com/sharepointmigration/introducing-the-sharepoint-migration-tool?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). When you run it on your computer, you can select a local or network folder and run an analysis. If any item looks incorrect, you will have a CSV report that mentions the reason for the failure. You will be able to fix it, and if you don't want to move the content manually, this tool can be a real asset for you (try to preserve file share permissions, user mapping, filters, replace invalid file name characters, etc.). ## πŸ“’ Announcements - SharePoint Framework (SPFx) Field Customizers will be retired from SharePoint Lists and Document Libraries on June 30, 2026 (postponed). - Microsoft Viva Engage's private content mode will retire on June 30th, 2025. - Microsoft will retire the Microsoft Lists mobile apps for iOS and Android. - Reminder: the Utility.SendEmail API will be retired on October 31st, 2025 - Microsoft Cloud Domain transition: it is the turn to Microsoft Forms with the new URL [https://forms.cloud.microsoft](https://forms.cloud.microsoft/?ref=blog.lsonline.fr) --- ## Favorite Feature of the Month **Copilot Adoption Community** --- ## πŸ“° News Microsoft 365 ### End of Legacy Authentication is coming The default security settings will be updated automatically on your Tenant- the impact is oriented by blocking legacy authentication protocols and requiring admin consent for third-party app access. Changes start mid-July 2025 and are complete by August 2025. --- Viva Engage ### New Communication Dashboard The moderators will finally find a good way to supervise the community content and configure a scenario for the specified keywords: - Need review - Dismissed - Muted ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-06-30-at-08.34.05.png) Viva Engage Dashboard [Communications dashboard: Advanced moderation - Microsoft SupportUse the Moderator AI agent to help manage discussion threads and conversations to define filtering for sensitive language and discussion focus.![](https://support.microsoft.com/apple-touch-icon.png)Microsoft Support![](https://support.microsoft.com/images/en-us/1dcefc05-a6c2-40b9-a289-6eea3cd15de6)](https://support.microsoft.com/topic/communications-dashboard-advanced-moderation-13f58cf0-b8e5-40ab-bc55-34d69f762c1d?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- Viva Engage ### GDPR Compliance The feature already exists, but was accessible only from the legacy admin center. Now, you can access it from the modern admin *Governance & Compliance > Data management.* ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.27.39.png) Manage GDPR Request from the modern admin --- Stream ### The End of Unification for Stream & Clipchamp Announced at the end of 2024, Microsoft chose to gradually transition the Microsoft Stream brand to Clipchamp. At the end, no big changes for final users. Just note that the URL of the Stream service [https://m365.cloud.microsoft/launch/stream](https://m365.cloud.microsoft/launch/stream?ref=blog.lsonline.fr) becomes [https://m365.cloud.microsoft/launch/clipchamp](https://m365.cloud.microsoft/launch/clipchamp?ref=blog.lsonline.fr) SharePoint ### Estimated Read Time for News Posts This is not a revolution, but Microsoft is listening to the feedback. Some feedback requested the ability to indicate an estimated reading time. This kind of feature is mainly used for blogs and communication websites. How can the estimation of read time be useful with SharePoint? - As a reader, he manages time effectively, stays focused, and engages more fully with the texts he is reading. - As a writer, it is a theory that an adult can read more or less 238 words/minute. With this information in mind, a writer/publisher should stay focused on the content without writing a whole book. By the subject of the post/page and the expectation of the readers, the writer can ensure the needed time to read the content, and if required, adjust the content to reduce the reading time to keep the interest of the audience. ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-06-17-at-20.52.46.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-08.06.13.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-06-17-at-20.54.12.png) SharePoint Estimated Time Page Feature --- Viva Engage ### Copilot Adoption Community Previously, this community template was only available to networks with at least one Copilot license. This is not the case anymore... If you didn't try it, it's time. You don't need to create a new community to access features linked to Copilot, but it is important to keep in mind that **you can only have 1 community** with the Copilot feature enabled. This type of community is very interesting to promote Copilot in your organization, and the suggested content is amazing. [Microsoft 365 Copilot adoption community in Viva EngageViva Engage rolls out a Microsoft 365 Copilot adoption community to answer questions and share best practices![](https://learn.microsoft.com/favicon.ico)Microsoft Learnv-rgrace![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/viva/engage/engage-365-copilot-adoption-platform?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-11.50.15.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-11.53.29.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-11.53.59.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-15.45.29.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-15.58.42.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-15.59.17.png) Viva Engage - OOB Copilot Early Adoption Community --- Viva Engage ### New Centralized Admin Role Management Microsoft is working hard to modernize Viva Engage Legacy capabilities for admins. Among these efforts, Microsoft has just included a UI to manage the roles while including the new corporate communicator feature. Viva Engage admins are spoiled 😁 ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.48.42.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.48.36.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.48.30.png) Viva Engage - Modern Admin Role Management SharePoint ### New Page Creation Wizard The previous right panel for creating a new SharePoint page has vanished. Let's take a look at a new "wizard" from which the users can select a set of awesome built-in page templates. Of course, you still access the custom templates if you have ones, but you still can't hide the built-in templates. I think the built-in templates are still helpful for users to explore more features and layouts around the pages. ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-06-17-at-20.50.46.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-08.27.44.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-06-17-at-20.51.21.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-06-17-at-20.51.27.png) New SharePoint Page Wizard Creation --- SharePoint ### New Anyone links to folders permission If you choose to keep the "anyone" sharing, you have a new permission on folders that you can define by default as an administrator: **View and upload**. > This feature allows more granular control over content access and maintains the "Request files" functionality. By default, Microsoft does not change the configuration for SharePoint. What is this new granular permission change? Before this feature, when a user chose to share a folder with anyone, he had the capability to choose the following permissions: - Can edit - Can view - Can't download Once the permission is defined to View and upload, the option *Can edit* vanishes, BUT the upload is still available for the Request files feature ❀️ ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.06.07.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.11.07.png) ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.11.35.png) SharePoint Sharing permission folder (before / after defined to View and upload) --- SharePoint ### New Storage Insight for Admins From the *Admin Center > Report > Usage > SharePoint*, there is a new tab named **Storage**. The SharePoint storage report provides an overview of your tenant’s storage profile across multiple geographies. The report will include suggestions for optimizing storage, such as setting file history limits, archiving inactive sites (Pro), and creating site lifecycle management (Pro) policies. Also, banner notifications will appear when your tenant is approaching or over the storage quota. ![](https://blog.lsonline.fr/content/images/2025/07/Screenshot-2025-07-04-at-16.43.36.png) SharePoint Storage Report Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - May 2025 URL: https://blog.lsonline.fr/2025/06/02/202505-msp-news/ Last updated: 2026-01-27T17:26:13.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [June 19th - Canadian Cloud Summit](https://www.communitydays.org/event/2025-06-19/canadian-cloud-summit-june-2025?ref=blog.lsonline.fr) ## πŸ’‘Trick & Tips How are you managing wide access to some of your SharePoint sites and OneDrive? Two words will illuminate your days: **Dynamic groups**. Thanks to the dynamic groups, you can, if you want, reproduce the Token Everyone Except external users: `(user.userPrincipalName -contains "contoso.com")` Thanks to the dynamic groups, you can regroup people quickly, for example: - per department - per country - per domain name - per job title - company name - and so much more... The last thing is, when you want to create a Viva Engage community or a Microsoft Teams team, behind the scenes, it is a Microsoft 365 group; this group can be "converted" to a dynamic group πŸ’ͺ. ## πŸ“’ Announcements - [Changes to the API access page in the SharePoint admin center](https://learn.microsoft.com/sharepoint/api-access?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) - [eSignature for SharePoint supports Word Documents](https://learn.microsoft.com/microsoft-365/syntex/esignature-overview?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) - [SharePoint Alerts Retirement](https://support.microsoft.com/office/sharepoint-alerts-retirement-813a90c7-3ff1-47a9-8a2f-152f48b2486f?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) - Whiteboard URL transitioned [https://whiteboard.cloud.microsoft/](https://whiteboard.cloud.microsoft/?ref=blog.lsonline.fr) --- ## Favorite Feature of the Month **Multi-color SharePoint Theme** --- ## πŸ“° News SharePoint ### SharePoint Start Page Experience From the new navigation, select a **Recently edited** site. The main content is refreshed to be related to the selected site. You will be able to create page directly to the selected site. ![](https://blog.lsonline.fr/content/images/2025/06/image.png) ![](https://blog.lsonline.fr/content/images/2025/06/image-2.png) Left navigation on the new SharePoint start page On the start page, from the list of pages, you have a useful Shortcut action menu with the following options: - **Open**: lets users view the selected page in canvas mode. - **Share**:lets users create a link to share the page with collaborators. - **Duplicate**: quick copy of the selected page. - **Manage access**: manage users' access. - **Delete**: moves the selected page to the recycle bin of the site ![](https://blog.lsonline.fr/content/images/2025/06/image-3.png) SharePoint Start Page - Action menu --- SharePoint ### Multi-color Theme Enabled by default, this feature introduces multi-color themes that support multiple color combinations in a theme. The theme colors will also show up in section backgrounds, the rich text editor (text web part) πŸ’ͺ How can you handle colors on your page? Select your section, and you will see a new tab named **Design**. *In my case, I used the Copilot logo colors.* ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.51.25.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.53.15.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.55.46.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.56.06.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.55.54.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.56.13.png) Multi-color SharePoint Theme SharePoint/OneDrive ### Control Enable OCR As an administrator, it is possible to enable OCR on OneDrive for specific users or all organization. Thanks to this feature, all documents can be retrieved from the search. > \[info\] Important: OCR is a pay-as-you-go feature. Turning on the OCR feature will incur cost for the organization. --- SharePoint/OneDrive ### Remove EEEU Token Are you using the **Everyone Except External Users** token to manage access for some SharePoint sites, libraries, etc? Microsoft will prevent the usage of this token for the following artefacts: - SharePoint Root site - The default document library in OneDrive's πŸ’‘ Look at the Trick & Tips of this month for more details about best practices --- SharePoint ### New Public CDN Currently, the SharePoint Online Content Delivery Network (CDN) URL is: `publiccdn.sharepointonline.com`. Microsoft will change this URL for Azure Front Door (AFD): `public-cdn.sharepointonline.com`. This change will take effect by the **end of July 2025**. --- SharePoint ### Additional Web Parts include Animation New feature release at the same time as the *Editorial* Web Part, the animation feature. This feature adds a depth effect when the page is loaded and the Web Part is visible. Currently, three Web Parts include this feature: - Editorial - Quick Links - People ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-01-at-22.56.33-1.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-01-at-22.56.38-1.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-01-at-22.56.44-1.png) Animation Web Part feature --- SharePoint **Preview Mode** You are a seasoned editor, and you want ensure that your page content match with the screen sizes, and mobile. It is really helpful to preview the content before publishing it and catch most of the display issues if they exist. ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-19.07.18.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-19.07.29.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-19.07.35.png) SharePoint Preview Page SharePoint ### Quick Steps Now, Microsoft has announced the end of the OOTB Alert feature on SharePoint; the provided alternative is Quick Steps. A couple of useful templates are available by default, and if this is not sufficient, you can execute your own flow ❀️ ![](https://blog.lsonline.fr/content/images/2025/06/image-4.png) ![](https://blog.lsonline.fr/content/images/2025/06/image-5.png) SharePoint Quick Steps --- SharePoint ### New Library Template A new library template was added to the collection: - Resume repository No big news, but that can be helpful 😊 ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-01-at-22.30.09.jpg) SharePoint Resume Template Library --- Microsoft 365 ### New Home Page The new branding for the Microsoft 365 home page (https://m365.cloud.microsoft) is here: - No top bar anymore - Direct access to Copilot - and so much more... ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.20.33.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.20.41.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.20.47.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.20.52.png) ![](https://blog.lsonline.fr/content/images/2025/06/Screenshot-2025-06-03-at-18.21.11.png) Microsoft 365 Home Page Hoping this post will help you, see you next month... πŸš€ ### MVP Summit 2025 - My First Experience URL: https://blog.lsonline.fr/2025/03/23/mvpsummit25/ Last updated: 2026-06-22T13:12:10.000Z Going to Seattle for the MVP Summit is one of the biggest events reserved for the MVP Community, and an opportunity for all MVPs to meet Microsoft product managers and engineers, as well as all other MVPs. This year, for the first time, I have the tremendous opportunity to attend this exceptional event in person, and I tried to share my experience with you. I can share all the steps I followed to go to Seattle from Montreal, the campus, the people I met, everything I can, while respecting Microsoft's NDA, etc. ## Plane and hotel Microsoft does not provide any discounts with the hotel or flight companies. So, you have to deal with the best price and the best place to be. In my opinion, for my first experience, I chose to deal with the best price. - **The plane**: use your favorite site to find the best price and the best period to travel. I did want to be present from the first day. I chose a night flight with a departure from MTL at 6 AM (alarm at 2 AM), a stop at Minneapolis, and arrived in Seattle at 10:45 AM (noticed that a jetlag of 3 hours minus) - **A place to sleep**: I chose an Airbnb mainly because of the price, which is less expensive than a hotel, and because Microsoft offers breakfast (you don't need to prepare it or pay for it). Do you know a better moment to discuss with other people than directly on the Microsoft campus? To be honest, during these 5 days, you spend more time on the campus and with other MVPs rather than at the hotel. You can find a lot of good places near the campus, or you can choose to take something in downtown Bellevue to access restaurants, bars, etc. ## Monday (day 1) - **Arrive on the campus** at noon at the 33 building by taxi (\~ $60) - the badge recovery that allows you to move and use shuttles on the campus - in addition, coffee and some donuts are waiting for you. Everyone is very kind, smiling, and ready to help you spend the best moments as many times as possible ❀️ - Start the first sessions of the week. You meet so many people, all of whom you can see on the community group videos, Microsoft events, etc. Meet all these people for real - this is an insane and unforgettable moment. In addition, some of them recognize you, come to say hello, and discuss with you as if you had already met them before - you are directly comfortable and ready to enjoy every day of this event. - **Microsoft Store**: MVP stuff is limited. If you want some MVP items branded, the earlier you go to get them, the more choices you will have... water bottles, socks, bags, etc. For my part, I ran to the store to take a bottle of water for the week 😁 - At the end of the day, enjoy drinking and eating with other MVPs, meet them, share your experiences, hobbies, and motivations, and go to sleep to rest for the next day. ## Tuesday (day 2) - **The keynote**: listen to Father's SharePoint (Jeff Teper) and other big heads of Microsoft products. You are in front of the most charismatic Microsoft leaders. Before that, you must take a band and make the lineup before entering the room - quite long, but it was worth it. - **Campus Tour**: take time to visit different buildings and specific amazing areas on the campus - Meet employees who share with you their experience and work of every single day - in some cases, you have no idea of their existence, the work they perform 😍🀩 - **Sessions**: too many sessions 🀯 Difficult to choose which one you want to be in-person vs watch later. I chose to prioritize the in-person session only and sessions for which I can discuss and meet people. Breakout sessions are amazing for directly pushing your vision, feedback, ideas, etc. You can bring direct input and have the opportunity to contribute to a better experience - Sharing is caring! ## Wednesday (day 3) - **Campus Tour**: still discovering the campus, the buildings, and Microsoft employees. I was surprised by the passionate Microsoft employees. They are all passionate (I would like to say lovely, crazy), kind, and they love sharing their experiences and jobs with us. Meeting these people is just a refresh and a source of motivation to go ahead - **Sessions**: plan your agenda wisely because of the distance between the buildings of the campus, and keep in mind that not all sessions will finish on time, especially if you have some additional questions and want to speak with the speaker, etc. - **Microsoft Store**: because I planned to leave Seattle the next day, I took some time to visit the store to get some souvenirs for my family and enjoy discounts linked to our MVP status 😘 - **1-on-1**: have the opportunity to talk with the Microsoft product owners, managers, and engineers, has no price. Give feedback, take feedback, advice, and have the opportunity to see people that you only saw virtually until yet is very exciting ## Thursday (day 4) This is my last day at the MVP Summit this year. - **Sessions**: more technical sessions about Copilot, SharePoint, wireframes, Microsoft Graph, etc. Really useful and interesting to know how Microsoft thinks about how they want to manage the services and their vision of the future, and moreover, the interest of the team to have direct feedback on their suggestion. Really appreciated the humble attitude from Microsoft to take feedback first and try to include it in their backlog. - **Logistic**: you can drop your luggage into a specific room to do not have to keep them with you all day long πŸ””πŸ˜Œ I recommend to take public transportation to go back to the airport because it is less expensive than the taxi ($3 for Metro and Bus) and it was pretty cool to have time to see the city and I had the opportunity to meet amazing people (bus driver very kind, passengers who shared good tips & tricks, ...) ## Conclusion Even if the logistics (hotel, plane, transportation, etc.) seem expensive, my first experience is just unforgettable. Not easy to go back to real life. The opportunity to see the campus, meet people that maybe I will never have another occasion to meet again, speak to so many people, and realize that some people behind the scenes produce so many things and have so much impact, it is just insane. The content of the sessions for the first two days was clearly oriented toward marketing... not really useful because all information is already available through the Microsoft blog and other MVPs. The last two days were more productive and interesting because we saw the future of the services and the vision of Microsoft (all content under NDA). Will I reproduce my experience next year if I am still an MVP? Maybe not, but for sure, as many as I still MVP, I will plan to go to the MVP summit, maybe every 2 or 3 years. Hoping this post will help you πŸš€ ### Monthly SharePoint News Digest - March 2025 URL: https://blog.lsonline.fr/2025/03/10/202503-msp-news/ Last updated: 2026-06-22T13:13:02.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - MVP Summit 2025 - [Canadian Power Platform Summit](https://www.canadianpowerplatformsummit.com/?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips A SharePoint Teams site is usually followed by a Microsoft 365 group. This group, in a SharePoint case, is used to allow access to the content as follows: - Group Owners: SharePoint owners and site collection administrators - Group Members: SharePoint members Of course, a Microsoft 365 group brings so much more, but the point is how to delete "permanently" a SharePoint Team site 🧐 If a user or administrator deletes the SharePoint site or the Teams site, the SharePoint site is moved to the "Deleted sites" section. As a SharePoint administrator, when you select this site to delete it permanently, the "Delete" button is still disabled. The first question can be: why, in the case of a well-structured life cycle governance, should an administrator delete a site manually and permanently? Things happen πŸ˜… A classic use case could be a user deletes a site and wants to create a new one with the same URL, but he can't because the URL already exists in the Tenant - even if the site was deleted. As long as the site exists, even is in the deleted site (recycle bin), it is not possible to reuse the URL to let the possibility to restore it after all. So, go back to our SharePoint admin Center and our SharePoint deleted site for which the "delete" button is disabled. When you click on the button, a request is sent to check if a Microsoft 365 group is linked to the site. For the same reason as the SharePoint sites, a deleted group still exists, so even in the deleted group, the following request will return information about it: ```HTTP /_api/SPOGroup/GetGroupInfo('{ID}') ``` As an administrator with enough permissions to be able to delete an Entra group, delete the Microsoft 365 group first and then go back to the SharePoint admin, then unselect the site and select it again... Ta-da, the delete button becomes available πŸš€πŸ˜Š It is possible that you have to wait a couple of minutes until it works. ## πŸ“’ Announcements - Copilot - End User License Requests & Self-Service Purchase - [Changes on SharePoint Framework (SPFx) permission grants in Microsoft Entra ID](https://devblogs.microsoft.com/microsoft365dev/changes-on-sharepoint-framework-spfx-permission-grants-in-microsoft-entra-id/?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- ## Favorite Feature of the Month **(Waiting for more feature...)** --- ## πŸ“° News SharePoint ### PowerShell to get SharePoint Agent Usage As a SharePoint Administrator or Global Admin, if you were lacking information about the usage of SharePoint Copilot Agent by your users, you will be happy to know that a new cmdlet is available to get more information at the Tenant level about: - Total trial queries used - Trial query left - Trial query available in the Tenant Do not forget to update your SharePoint PowerShell module (16.0.25813.12000) before trying this cmdlet: ```PowerShell Get-SPOCopilotPromoUsage ``` --- Exchange ### Change your Office Location from My Day Panel Are you using "My Day" panel from Outlook? If yes, you will be able to see a new area that allows you to change your office location directly - no need to go to the calendar anymore πŸ‘ ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-10-at-15.45.49.png) SharePoint/OneDrive ### Clearer Shortcut Naming in OneDrive When you add a shortcut from a SharePoint library/folder into your OneDrive, the shortcut has exactly the same name as the library or folder (thanks for this explanation πŸ™). Same behavior when someone shares of OneDrive folder with you and you add it as a shortcut into your OneDrive... The point is that it has changed! Microsoft automatically adds a prefix to the target item - this prefix grants the benefit of being clearer about the source of the item: - SharePoint: \[site name\] - \[item name\] (ex, *Monthly SharePoint News Digest - Documents*) - OneDrive: \[user display name\]'s - \[item name\] (ex, John Doe's - ideas) > \[note\] Note > After I have been rename the SharePoint site, the shortcut name didn't change... I will wait more longer... ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-10-at-14.55.21.png) SharePoint ### The Show Title Web Part option came back I already saw this feature last year, but was just vanished a couple of weeks later... Now, this feature came back πŸš€ You can hide some Web Parts' titles and even choose the heading level ❀️ ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-10-at-15.20.02.png) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - February 2025 URL: https://blog.lsonline.fr/2025/02/18/202502-msp-news/ Last updated: 2026-06-20T23:51:12.000Z **New month, new features for the Microsoft 365 Collaboration Tools ?** ## πŸ’‘ Trick & Tips By default, users can add an Entra App third party without any consent from an administrator as long as the scope of the app is still Delegated. - Delegated permission: take into account the current user permissions to access data. The application cannot provide more access than the current user already has - Application permission: whatever the current user permissions are, the application can access what the user wants Even if the delegated application does not provide more permissions than the user has, that can allow the third app to access the user's information, such as calendars, files, emails, etc. As an administrator, you can prevent any user from adding the Entra app, and you can activate the consent requests. That means no user can add a new app alone, but they can request it. Any user identified as the reviewer can approve or refuse the user's request, following the security and governance of the organization (they cannot approve their own request), for Delegated application permissions. Only users with the Global, Application, or Cloud application administrator role can grant admin consent (they can approve their own requests). ## πŸ“’ Announcements - End of the SharePoint Space Pages - The SharePoint "My Feed" Web Part will be retired next month - [Microsoft released a new feature in Azure RBAC](https://learn.microsoft.com/azure/role-based-access-control/whats-new?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- ## Favorite Feature of the Month **Next Level of List Forms** --- ## πŸ“° News SharePoint ### End of SharePoint Space pages Did you use the SharePoint Space pages in your environment? Even if it was a cool feature, I never had the opportunity to use this kind of page in production in SharePoint. It seems that not many organizations invest in this feature either. This is one of among other reasons why Microsoft will retire this feature at the end of August 2025\. Remember these dates: - March 2025: The feature will be disabled by default - May 2025: Users will not be able to activate the feature anymore - End of August 2025:? ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.14.06.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.14.15.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.14.59.jpg) Do you remember SharePoint Space Pages? --- SharePoint ### The New Editorial Card Web Part Let's place your creativity... After usage, I understand better the purpose of this Web Part - Highlight products, events, discounts, whatever... - Create your signature (ex: any kind of blog with the author signature at the end) - just a sort of snippet is missing to avoid reconfiguring it every time ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-18.54.17.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-18.54.31.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-22.05.30.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-18.55.12.png) The new SharePoint Editorial Card Web Part [Introducing Editorial Card web part for SharePoint | Microsoft Community HubWe are excited to unveil the Editorial card web part, a versatile new feature designed to elevate the aesthetics and functionality of your SharePoint pages...![](https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/themes/customTheme1/favicon-1730836283320.png?time=1730836286415&image-dimensions=180x180)TECHCOMMUNITY.MICROSOFT.COMTinaChen![](https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00MzY5OTk2LTlRVlgwSA?revision=4)](https://techcommunity.microsoft.com/blog/spblog/introducing-editorial-card-web-part-for-sharepoint/4369996?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- Viva Engage ### Additional Community Analytics ![](https://blog.lsonline.fr/content/images/2025/03/VivaEngage-CommunityAnalytics.jpg) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-22.52.27.png) Viva Engage - New Analytics [Monitor engagement in Viva Engage with analytics - Microsoft Support![](https://support.microsoft.com/apple-touch-icon.png)Microsoft Support![](https://cxcs.microsoft.net/static/public/viva/neutral/9a13eb4e-de1e-495d-a792-26472299df67/b7d818b69ac09ce85a1db28ed6147372dc312ef7.png)](https://support.microsoft.com//topic/monitor-engagement-in-viva-engage-with-analytics-0d9f6fd5-6b0c-45a2-a0aa-0576ae1f6895?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- SharePoint ### Documents Library Grid mode enhancements Such as a SharePoint list, users can edit a document library through the "grid" mode. Microsoft improves the user's experience by adding some new behaviors/capabilities in Grid edit mode: 1. Change the Choice field value 2. Change the Person and Group field value 3. Add or change the Image field content 4. No pagination 5. Open the file detail from a pop-up rather than the panel 6. Be able to edit the items in the library even when they are grouped by a column 7. Navigate through the folder and still in edit mode 8. The default title column is clickable to open an item without exiting the grid edition mode Entra ID ### People Administrator Role This is the new role available on Microsoft Entra. This role provides dedicated permissions for managing people-related settings and profile photos without needing the high privileges of the Global admin or User admin roles. ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.39.12.jpg) Microsoft Entra - People Administrator Role information --- SharePoint ### Next Level of List Forms The famous List Form has new improvements that allow the use of more fields (almost all), next level of branching, and an interface. Which **fields** are still not supported yet: - Managed Metadata - Rating **Branching**: all fields can branch to another field, but the only branching based on the selected value is still the chosen one. **Interface**: - Logo - Start and End date of the submission - New PowerShell cmdlet to hide collaborators / co-authoring users ```PowerShell Set-SPOSite -Identity -HidePeopleWhoHaveListsOpen $true ``` ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-14-at-09.09.55.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-21.46.10.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-21.50.58.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-21.49.57.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-22.02.14.png) SharePoint List Form [Microsoft Lists forms: What’s New | Microsoft Community HubMicrosoft Lists forms help you get the specific details you need from various people and groups, without overexposing your full list and list details. With...![](https://techcommunity.microsoft.com/t5/s/gxcuf89792/m_assets/themes/customTheme1/favicon-1730836283320.png?time=1730836286415&image-dimensions=180x180)TECHCOMMUNITY.MICROSOFT.COMsahilbaid![](https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzc0MDM3LTZsbUd2Tw?revision=4)](https://techcommunity.microsoft.com/blog/spblog/microsoft-lists-forms-whats-new/4374037?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- Viva Engage ### Multi-Pin Conversations As a community admin, you were able to pin a conversation - highlight a conversation to the top of the community newsfeeds. Now, you can pin more than one conversation - they are displayed as a carousel ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-22.49.18.png) Viva Engage - more than one pinned conversation Exchange ### Are You at the Office Tomorrow? Since remote working was integrated into most of the organization, it is sometimes tricky to know who will be at the office... You can use [https://aka.ms/places](https://aka.ms/places?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) URL to access your colleagues' calendars to have an overview of the absences and who will be at the office (based on the user calendar). The new calendar experience (Teams and Exchange) allows you to click on the header of the day of the week and see who will be at the office. Now, you can directly see who will be at the office tomorrow without any effort. ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-23.25.40.jpg) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-18.46.20.png) Outlook - Display Teammates Location from Calendar --- SharePoint ### Keep Tweaking the Text Web Part When the layout is smaller, the quick edit bar groups similar-themed features together. In other words, the Text Web Part edit bar is adjusted following the width of the section column. ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-22.35.46.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-22.38.03.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-22.38.30.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-22.37.25.png) SharePoint Text Web Part - Responsive quick actions bar --- Viva Engage ### New Reaction experience More trends, more compliance with general social networks... Microsoft is still improving Viva Engage ❀️ ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-10-at-15.54.34-1.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-02-26-at-21.27.02-1.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-02-26-at-21.27.28-1.png) Viva Engage - new reaction feature --- SharePoint ### Begin Page Improvements A left Rail container was added. This improvement brings some coherence to OneDrive and the left navigation: - **Create** a dropdown to quick access a Blank page and a New site - Quick access to **My Content** - **Recently edited** the area to display the last sites for which one page was created ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-21.31.01.jpg) SharePoint Begin page --- SharePoint ### Search in Messages Users can directly search their Teams messages and Outlook email content from the SharePoint search page. Maybe the Viva Engage messages could be added in the future? ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-23.40.21.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-15-at-23.45.20.png) SharePoint Search - Message Tab Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - January 2025 URL: https://blog.lsonline.fr/2025/01/15/202501-msp-news/ Last updated: 2026-06-20T22:04:27.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** **\_.:| HAPPY NEW YEAR 2025 |:.\_** ![](https://media4.giphy.com/media/v1.Y2lkPTc5MGI3NjExcWM2bTJxa2ozYmU4M2g3dmczd3NnZ2U1ejBzcmh0NWYyZ2V1ZXZncSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26gN0tOOJIhPjUFNK/giphy.gif) ## πŸ—“οΈ Events around Microsoft 365 - [Community Days - M365 Miami](https://www.communitydays.org/event/2025-02-06/m365-miami?ref=blog.lsonline.fr) - [M365 Community Days DC 2025](https://www.communitydays.org/event/2025-02-21/m365-community-days-dc-2025?ref=blog.lsonline.fr) - [M365 Community Days - Phoenix](https://www.communitydays.org/event/2025-02-21/m365-community-days-phoenix?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips What better way to begin than by cleaning your Azure Active Directory and managing your guests' access and accounts? By default, for any sharing to an external user made and accepted (recipient clicks on the link), a guest user account is created in your environment. Following your sharing policy, the sharing link can expire. If the shared file is deleted or moved, the external user may no longer have access. If the sharing settings of the file have been reset, the external user would not have access to the file. All of these scenarios ensure that a user guest account was created and may not be active in your environment anymore. For security reasons, it is not advised to keep this kind of account without any policy or lifecycle management. The first recommendation consists of grouping these accounts into a Dynamique Security Group to apply specific conditional accesses, policies, and monitoring. Then, you can check the activity of the accounts and disable some accounts... It is not advised to delete the account to keep track of some changes and history. If you delete several accounts, a few months later, you will see "unknown" users rather than your guests' information. As an administrator, you can configure a guest access review workflow with stages to manage these accounts without additional script or custom workflow πŸ™πŸ˜ ## πŸ“’ Announcements - OTP Authentication through WhatsApp - Pay-as-you-go billing for Agents in SharePoint - Microsoft has started to implement the update for unlicensed OneDrive accounts --- ## Favorite Feature of the Month **New SharePoint Editors Experience** --- ## πŸ“° News Entra ID ### OTP on WhatsApp This news is mainly for the Entra administrator. As usual, I'm only sharing information that I can try on my side in my environment. In some exceptions, like this one, I'm sharing information that is coming because it is something that will be pushed by default and have an impact on users. By default, the default channel to send a One-Time-Passcode (OTP) will be WhatsApp if the user has configured it with their device and cell number; otherwise, the message will be sent by SMS - So, don't be surprised πŸ€“ How Microsoft can know if you have configured WhatsApp: *"To check if a user has WhatsApp, we silently try to deliver them a message in the app by using the phone number they registered for text message verification."* [Phone authentication methods - Microsoft Entra IDLearn about using phone authentication methods in Microsoft Entra ID to help improve and secure sign-in events![](https://learn.microsoft.com/favicon.ico)Microsoft LearnJustinha![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/entra/identity/authentication/concept-authentication-phone-options?ref=blog.lsonline.fr#text-message-verification?wt.mc%5Fid=MVP%5F386670) --- Viva Engage ### Mute Conversations As a user, you were able to mute a whole community to not be disturbed... but sometimes, because of one feed only, you were spammed by notifications that maybe were not interested you at all or anymore. Microsoft offers the solution - you are now able to just mute the conversation only 🀫 ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.50.28.jpg) Viva Engage - Mute conversation feature --- SharePoint ### Viva Connection appears in the SharePoint Bar To improve the user experience, Microsoft introduced Viva Connection directly into the SharePoint App bar. The main purpose of this addition is to facilitate the switch from a SharePoint site to the intranet/home site. ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-21.39.39.png) Viva Connection into SharePoint App bar SharePoint ### Documents Approval After the lists only, now it is the turn of the SharePoint libraries... You can finally remove your Power Automate approval flow to replace it with the OOTB one πŸ‘πŸ˜πŸš€ Such as the list, enable the feature from the library commands bar and enjoy - this is a really cool feature to add a granular lifecycle to your documents ❀️ ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-21.57.37.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-21.57.44.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-21.58.03.jpg) Documents Library approval feature --- SharePoint ### New Accessibility Assistant Did you notice this new little boy visible from the SharePoint toolbar? If you are not familiar with web accessibility, this little boy will help you. By clicking on the "pain", you will be directly redirected to the Web Part component - ready to fix πŸ’‘ ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.57.08.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.59.51.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-23.02.45.jpg) SharePoint Accessibility Assistant --- Viva Engage ### Community Expert What an interesting feature! For example, you have a tech community about a specific technology, such as Microsoft Collaboration tools, for example. When people were throwing information around... how do you know if this information was relevant to the organization? Was this person's knowledge sufficient to elaborate on certain topics? etc. It is now possible to designate one or more members of the community as "experts" from the community settings. ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-23.45.52.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-23.45.59.jpg) Viva Engage - Assign Expert --- Exchange ### Colored Folders After OneDrive and SharePoint, it is the turn of Outlook to have the colored folders feature πŸš€ ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-04-at-21.52.20.png) Outlook (web) colored folders --- Viva Engage ### Verified Answer When someone is asking a question, all the community members can offer an answer. Before, when the answers were correct, it was possible to mark them as "Best answer". This feature, by the way, is awesome ❀️. Now, in addition to the "Best Answer" feature, an expert or an admin of the community can mark an answer as a "Verified answer" πŸš€... Key Benefits of "Verified Answers": - **Enhanced credibility**: With Verified Answers, users can confidently rely on the accuracy of responses, knowing that they have been reviewed and endorsed by designated experts. - **Streamlined knowledge sharing**: Verified Answers are highlighted and pinned at the top of discussion threads, making it easier for everyone in the community to access key information quickly. - **Robust community engagement**: This feature not only recognizes the expertise within your community but also fosters a culture of trust and thorough knowledge exchange. ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-09-at-20.31.39.png) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-09-at-20.36.06.png) Viva Engage - Verified Answer Exchange ### How do to Pronounce your name? If you are working with colleagues who do not have the habit of pronouncing your name, this feature can be really helpful ❀️ Your first name, last name, or both of them are quite complicated to pronounce. Help your colleagues by recording your pronunciation, and your colleagues will be able to listen to it 🎢 > \[Note\] Note > This feature is available on Microsoft Exchange Online and Microsoft Teams. ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.21.22-1.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.21.36-1.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.22.19-1.jpg) ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-22.31.58.jpg) Record your full name pronunciation --- SharePoint ### New SharePoint Editors Experience Cut and pasting combination keys or deleting the content to rebuild it elsewhere in a SharePoint page was not the funny part if you are someone who is working every single day with SharePoint pages. Microsoft drastically improved the drag & drop Web Part experience on the pages; to be honest, I ❀️ it so much! Win time, less effort, and improve your value as an author πŸš€ - Cursor icons have been updated to reflect drag & drop actions - You can now drop a web part on the plus button between sections to add a new one-column section to the page with the dropped web part - You can replace images that exist on the canvas by dropping an image from the content pane toolbox on top of the pre-existing image - Default stock images on the content pane toolbox will update based on the SharePoint page title --- Exchange ### Pin Shared Folder Are you working with a colleague or a Shared Mailbox with a Shared Folder? In some cases, being able to PIN these kinds of folders can be even more useful if you are using them every day and you don't want to get them at the bottom of your other mailboxes or folders. Good news, now you can PIN the Shared Folder into Outlook πŸ’‘ --- SharePoint ### Leaders Feed Conversation A new option is available for the Conversation Viva Engage Web Part: **Leaders**. A Viva Engage Premium license is required to benefit from this feature πŸ˜‘ For more information about Leadership Corner, check this link: [Leadership corner in Viva Engage - Microsoft Support![](https://support.microsoft.com/apple-touch-icon.png)Microsoft Support![](https://cxcs.microsoft.net/static/public/surface-and-devices/neutral/4873755a-8b1e-497e-bc54-101d1e75d3e7/d07c07fd6aabfe12ed716e87301dc3a1a3a7b5b0.png)](https://support.microsoft.com/topic/leadership-corner-in-viva-engage-2885e8d8-cb6c-4c11-b9aa-ed24a497b467?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2025-03-09-at-18.21.57.png) Viva Engage - SharePoint Web Part Leaders Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - November 2024 URL: https://blog.lsonline.fr/2024/10/30/202411-msp-news/ Last updated: 2026-06-20T22:06:18.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [Microsoft Ignite 2024](https://ignite.microsoft.com/?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips By default, any SharePoint user who wants to create an advanced/custom form, if the dynamic fields feature is not sufficient, can create a Power Apps canvas directly embedded into SharePoint. This user, who created a custom form based on Power Apps, is called a Maker – when he creates a custom, a canvas app is created in the default environment. By default, all makers (users with Power Apps licenses) can create apps. To avoid cluttering the default environment with these apps, you should create a separate environment to store custom SharePoint forms. This recommendation allows Power Platform admins to separate SharePoint forms from the general productivity apps in the default environment. --- ## πŸ“° News Exchange/Outlook ### New Admin Portal URL It is the turn of Microsoft Exchange to be part of the new Microsoft URL experience. Most of the services were already migrated to the `admin.cloud.microsoft` URL. Now, if you want to access the Exchange admin center, here is the new URL: https://admin.cloud.microsoft/exchange. As an administrator, you will be automatically redirected to the new URL, but the old one is still working. Viva Engage ### New Header Community Enhancements Microsoft is still giving some love to Viva Engage. News features are coming and among them, one of them is the Header: 1. Display the privacy of the community (only private labels displayed ) and the posting permissions (only the restricted label is displayed), rather than the button "Join" the community on the header image 2. In addition to the favorite button, the analytics is available, and the sensitivity label was removed 3. The title and description font, size, and color changed 4. The icon of the community is a little bit smaller ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-22-at-18.55.34.png) New Viva Engage Header Viva Engage ### A New Centralized Button for your creations From one button, unleash your communication and influence talents πŸ’‘ In one click, create: - Post (discussion, question, praise, poll, article) - Community - Event - Campaign ![](https://blog.lsonline.fr/content/images/2025/02/Screenshot-2025-02-26-at-16.29.18.jpg) Viva Engage "Create new" button > \[Note\] Note > In my screenshot, Campaigns an Events are not available because they are included only if you have a Viva Engage Premium. Learn more about licensing [here](https://learn.microsoft.com/viva/engage/manage-engage-licenses-microsoft-365?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). Hoping this post will help you, see you next month... πŸš€ ### Speaking at CommunityDays - October 2024 URL: https://blog.lsonline.fr/2024/10/20/speaking-at-communitydays-oct-2024/ Last updated: 2026-01-24T03:20:13.000Z This year and for the second time, I have the opportunity to speak at the CommunityDays and I will be presenting "**Faire de la recherche SharePoint votre alliΓ©**".β€Œβ€Œβ€Œβ€Œ During this workshop session, we will see together how the engine of SharePoint works and how we can customize it to meet your business need and improve your production and collaboration. In addition to this, we will work together to build a SharePoint page to put into pratique all the concept. β€Œβ€ŒThe CommunityDays will take place on October 26th. Do not hesitate to register for the event [here](https://communitydays.org/event/2024-10-26/m365-community-days-mtl-2024?ref=blog.lsonline.fr), it's free - the places are limited ?. ### Monthly SharePoint News Digest - October 2024 URL: https://blog.lsonline.fr/2024/10/01/202410-msp-news/ Last updated: 2026-06-20T22:08:55.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [Community Days | M365 COMMUNITY DAYS MTL 2024](https://communitydays.org/event/2024-10-26/m365-community-days-mtl-2024?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips The SharePoint Managed Path is part of all of your SharePoint sites. Have you already noticed that all SharePoint sites' URLs look like this: \- .sharepoint.com/\[managed path\]/your-site Previously, on SharePoint On-Premises, administrators could manage them by adding, removing, and customizing them. With SharePoint Online, it is not possible anymore. You can deal only with two managed paths: - teams - sites By default, "sites" is the managed path for all SharePoint sites. The administrators can change this setting and define "teams" by default. This change does not affect existing sites, but only the new ones. Being able to determine which SharePoint site is linked to a Microsoft 365 group/team, without having to check the properties, but only based on the URL, can be useful. Imagine, all of your SharePoint sites with a Microsoft 365 group/teams have a URL with /teams/ and all others with /sites/. That is something helpful for you 🀞 - As a user, you can directly identify the "type" of SharePoint - As an admin, you can easily create some rules (regex) based on the URL format - As a communication department, you can ensure that all /sites/ are "official" and you can deal with collaboration sites. Ex: /teams/finances and /sites/finances --- ## πŸ“° News SharePoint ### Site Branding per Site This feature is really useful for final users and provides free up time for advanced users / SharePoint admins. No need to be a SharePoint Admin to create and provide font and theme from the global Branding Center β€οΈπŸ‘πŸš€ Now, as a user, you can create a new Theme and provide a custom font per SharePoint site collection. Relative URL to access the site branding: `/_layouts/15/brandcenter.aspx/sharepoint/themes` ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-21-at-10.54.52.png) ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-21-at-10.55.12.png) ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-21-at-11.02.21.png) ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-21-at-11.05.31.png) Stream ### New video from Outlook You can now, directly from Microsoft Outlook, record a new video (stored in your OneDrive *My files > Recordings > Video Clips* ) and share it via email. Note that the video is contained in a Loop component in the email body. No need to record and share the video via a preconfigured Loop component or through attachment now... that can be a real gain in productivity ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-28-at-11.10.31.png) ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-28-at-11.10.57.png) ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-28-at-11.14.03.png) ![](https://blog.lsonline.fr/content/images/2024/10/Screenshot-2024-10-28-at-11.12.54.png) ### Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - September 2024 URL: https://blog.lsonline.fr/2024/09/04/202409-msp-news/ Last updated: 2026-06-20T22:11:17.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [Community Days | M365 COMMUNITY DAYS MTL 2024](https://communitydays.org/event/2024-10-26/m365-community-days-mtl-2024?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips SharePoint search is a powerful tool, but have you explored the search schema's more capabilities rather than the OOTB ones? You have a lot of information provided by the search results. The search can find items by their title, author, created date, content (OCR compatible included image), and so much more... But what about your custom metadata? By default, none of the custom metadata are refinable or searchable except if you choose to take some OOTB metadata that you can reuse, such as the title, author, filename, filetype, etc. In SharePoint Online, you will find all [managed properties supported by SharePoint 2019](https://learn.microsoft.com/sharepoint/technical-reference/crawled-and-managed-properties-overview?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) in addition to the [specific properties to SharePoint Online](https://learn.microsoft.com/sharepoint/crawled-and-managed-properties-overview?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). Do you dream of being able to retrieve all of your files based on "Category" (for example) metadata by only one search string: `Category="Hello world"`? To be able to search by your own metadata, you must use the [dedicated unused managed properties](https://learn.microsoft.com/sharepoint/manage-search-schema?ref=blog.lsonline.fr#default-unused-managed-properties?wt.mc%5Fid=MVP%5F386670). Thanks to them, you can map your custom columns/fields to one of them and use it for your own search purposes. Finally, [SharePoint search requests use KQL syntax](https://learn.microsoft.com/sharepoint/dev/general-development/keyword-query-language-kql-syntax-reference?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). This is a simple language to perform advanced search requests accessible for all users, regardless of their knowledge of Microsoft and search systems. Having said that, you can still search by full text. --- ## πŸ“° News SharePoint ### Additional features for Text Web Part Microsoft has taken some time to add super useful features to the maybe most used Web Part for SharePoint: "Text". - You can **set a custom font color** (this is one of my most expected features for a while ! When you have a dark image as background and text, it was not possible to choose the white color, for example) - You can manage **space between paragraphs and headers** (no need to press enter several times anymore) - **New quote design** (Quote Icon is my favorite one 😁) - For **new tables** only, such as Microsoft Word (for example), you can highlight the number of columns and rows that you want ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.55.06.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.56.26.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-07.24.57.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.50.38.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.56.48.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-07.27.45.png) --- Stream ### Reactions Such as a meeting or a live event, you can now add reactions in a video 🀩 This feature can be really useful to determine when a user likes a part of the video, and this information can be really useful to know what kind of information is appreciated... with this information, you can orient your next videos to better match the user expectations πŸš€ ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-16-at-10.43.26.png) Forms ### New UI Microsoft has revamped the interface of Microsoft Forms. - The home page is easier and more efficient - The settings and configurations are more accessible through specific buttons in a float panel ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.27.36.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.34.26.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.34.56.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.35.45.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.35.58.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.36.42.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.36.36.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-05.45.28.png) --- Microsoft 365 ### Left bar redesigned Microsoft pushes some new UI changes... The Microsoft 365 Home page: - The left navigation is now vertical-align middle - The apps launcher is not part of the left navigation anymore... The app launcher joined Microsoft 365 - The Microsoft 365 logo took the place of the apps launcher - New button **Create** to access the document creation page ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-16-at-10.38.39.png) SharePoint ### Define theme color from Brand Center No need to use PowerShell anymore to add custom colors to the sets of SharePoint themes, and no need to go to [Fluent Theme Designer](https://fluentuipr.z22.web.core.windows.net/heads/master/theming-designer/index.html?ref=blog.lsonline.fr) anymore πŸ’ͺ Everything's embedded directly into Brand Center πŸ’‘ You can now define your own colors and use them to create your own themes and all of it, without any "code" line πŸš€πŸ’ͺ ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-07.40.51.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-07.41.10.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-07.41.16.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-13-at-09.48.43.png) --- OneDrive ### New Quick Search Filters ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-16-at-10.41.50.png) --- SharePoint ### The New SharePoint Start Page Do you remember a couple of years ago? Microsoft already tried to push a new SharePoint start page but rolled back. This time, it is here πŸ₯³ Welcome to the new SharePoint area: ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-30-112342.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-30-112541.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-30-112625.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-30-112649.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-30-113200.png) You can access the page via the relative URL: `/_layouts/15/begin.aspx` Note that it is mainly a sort of home page to manage your SharePoint pages... this is not totally a crazy idea if you love sharing or working via SharePoint pages rather than office files. If you or your company manage a lot of pages for knowledge, procedures, communications, etc., you can : - Check the number of views - Check the status (draft or published) - Get the link and share - Delete - Manage access We will wait for the next updates, maybe to have more information and actions such as: - Site origin - Tags - Search - Anything else? Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - August 2024 URL: https://blog.lsonline.fr/2024/08/05/202408-msp-news/ Last updated: 2026-06-20T22:14:36.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 ![](https://blog.lsonline.fr/content/images/2024/07/image.png) ## πŸ’‘ Trick & Tips What is the main difference between a SharePoint folder and a library? Using a folder is still interesting when, as a user, you need to manage the content through OneDrive Sync. Here are some main points that can help you to choose wisely between folders or libraries: - **Metadata**: are managed by the content types. If you are using the default content type and creating a library metadata/field, all files are impacted. You can limit this impact by using content types, but you can't restrict the usage of some content types for some users. - **Colored Folders**: This feature (highlighted in this monthly digest) is only available for SharePoint and OneDrive folders. In fact, it is just pretty πŸ˜… - **Teams Channel**: be designed, when you create a new Teams channel, behind, a new folder is created in the default Shared Documents library - [**SharePoint limitations**](https://learn.microsoft.com/en-us/office365/servicedescriptions/sharepoint-online-service-description/sharepoint-online-limits?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr): a library can contain 30 million items 🀯, but after 5,000 items, you will have some limit with the list view, and after 100,000 items, you will not be able to break the permissions on the list/library or folders. Note that you can create 2,000 libraries in the same site collection. - **Share content**: sharing a folder looks easier than sharing a library. Right-click with the mouse or click on "share" right to the title folder, and you can share a folder. To share a library, you must go to advanced settings and manage permissions... - **URL**: if you change your mind and want to change a folder name, you will change the URL access of this folder (favorites, shared links, automation, etc.). When you rename a library, the URL does not change. --- ## πŸ“° News SharePoint ### New Content Panel Here is a potential feature that can offer a real added value for writers... You have as options: - **Toolbox** (the suitcase icon): quick access to Web Parts, stock images, and section layouts - **Properties**: helpful only for some Web Part allows you access to Web Part advanced properties. ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-05-at-13.11.27.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-05-at-13.12.55.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-05-at-13.11.38.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-05-at-13.12.29.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-05-at-13.12.49.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-05-at-13.12.49--2-.png) --- SharePoint/OneDrive ### Windows Colored Folders One of the most shared features that I have seen these last weeks... After being able to define folder color in OneDrive, then in SharePoint, you can see the colored folder in your file explorer (Windows only). No option to define a color from Windows Explorer yet (only from the web UI). It works with synced OneDrive and SharePoint libraries too: ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-01-at-19.52.42.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-01-at-22.02.32.png) OneDrive ### Additional filters To retrieve your file more easily, OneDrive has some "basic" filters to focus on the Office file type. You have additional filters: - OneNote - Microsoft Lists - Videos - Loop - Photos - Whiteboard - PowerBI ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-21-at-12.43.35-1.png) --- Microsoft 365 ### Apps Portal During a couple of months, users can see the left navigation bar changed... Some shortcuts progressively disappear and are not possible to manage. That's an old story πŸ™„ You will see soon a modal dialog appear when you open the Microsoft 365 portal and see the new capability that allows you to manage shortcuts in the left navigation bar. Please take note: - You can only add 3 shortcuts (for the moment) - All of your shortcuts can be placed only below the "Apps" icon ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-01-at-17.14.49.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-01-at-17.15.04.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-01-at-17.14.59.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-03-at-05.48.51.png) ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-09-03-at-05.49.12.png) SharePoint ### Pages fully rendered email When you are creating a new News post, all templates are grouped, and you no longer need to select from a specific email-ready category Previously, when you shared a page, the email was a link only βœ… now, such as the "news" templates, a shared page benefits a full and beautiful rendering in the emails πŸš€πŸ˜ ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-21-at-12.42.23.png) --- SharePoint ### New Content Panel Design Ideas Predefined templates to configure section layout and content. **THIS IS THE FEATURE**. Just imagine the potential of this feature 🀯 - Predefined section templates, such as "snippets" scoped to the site or even the Tenant πŸš€ - Such as PowerPoint, create the design based on the existing content on the page - Propose the most used section layouts used on the site and/or by the user - Copilot, and so much more... ![](https://blog.lsonline.fr/content/images/2024/09/Screenshot-2024-08-12-at-12.04.19.png) SharePoint Design Panel Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - July 2024 URL: https://blog.lsonline.fr/2024/07/19/202407-msp-news/ Last updated: 2026-06-20T22:16:58.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 ![](https://blog.lsonline.fr/content/images/2024/07/image.png) ## πŸ’‘ Trick & Tips You are using the SharePoint search to find something across OneDrive or your SharePoint site but you don't know how many time needs to apply changes? Here, based on an old plan test, an idea of how much times you have to wait before seeing changes in your SharePoint search: 1. Add a new document/item: 0 - 15 min 2. Edit an existing document/item: 0 - 1 hour 3. Delete an existing document/item: 0 - 3 hours What do you have to do if you waited longer than these numbers? 1. These numbers are based on a clean environment without extreme configuration in the search and without Terabytes of data and less than 1,000 user accounts. All additional information added to the search can increase the time between your changes and the search results (custom refinable, custom properties, complex unique permissions, number of data, and weight of data) 2. It is possible that the search "mist" your change. You can try to force the search index - Library/List indexation: reindex the list or the library only if items are not updated on the existing search schema - Site indexation: reindex the site only if you change the configuration, update the search schema and you are not able to see your changes from the search results (ex/ new refinable property) --- ## πŸ“° News SharePoint ### Reindex dialog box reason In April, the SharePoint dialog box to reindex a site or a list/library SharePoint was modified by adding a checkbox to be able to launch the request. This month, in addition to this checkbox, you have to specify the reason for your request: - There has been a change in the search schema - Library content is missing from search results - Library content in the search index is inaccurate or out of date - Permissions for library content are not reflected correctly in search results - Other reason ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-14.15.20.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-14.15.56.png) New re-index justification SharePoint ### Page Banner This is the end of the page title area on SharePoint, and welcome to Banner πŸ₯³ Previously, if you wanted to remove the page title area, you had to change the page layout (ex: Home page layout) via PowerShell, Graph, or CLI. Now, the new page template has a Banner; this banner can be removed. Moreover, because this is a Web Part, you can add as many banners as you want on the same page πŸš€ - The banner can be added in any kind of section (full-width or not) - In addition, we can access 2 news layouts: Author and Fade - If you choose to remove the Banner, you can access the page title from the page command bar (on the left of the "*Save as draft*" button) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-17-at-14.35.05.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-17-at-14.35.11.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.19.17.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.18.18.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.18.53.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.18.08.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.19.34.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.20.45.png) ![](https://blog.lsonline.fr/content/images/2024/07/Screenshot-2024-07-08-at-12.21.20.png) SharePoint ### Page Co-authoring The SharePoint page co-authoring is an expected feature in SharePoint. Collaboration around documents is the heart of SharePoint - I am a SharePoint page lover. Rather than writing Word documents, PDFs, or PowerPoint files and then managing versions (by SharePoint versioning or file name convention), why do not use SharePoint pages to share information? And now, in addition to increasing this collaboration, more than one user can edit the same SharePoint page 😍πŸ’ͺπŸš€ The important thing to know here is that a user can only edit one Web Part that is not already being edited by someone else... In other words, if you have only one Text Web Part, for example, only one user can edit the content... So, it is the moment to think about splitting your content by section and Web Parts, as you are already doing when you are working on Microsoft Word. ![](https://blog.lsonline.fr/content/images/2024/08/Screenshot-2024-08-05-at-13.09.06.png) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - June 2024 URL: https://blog.lsonline.fr/2024/06/06/202406-msp-news/ Last updated: 2026-06-20T22:25:59.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [https://www.communitydays.org/event/2024-06-14/m365-community-days-mtl-2024](https://www.communitydays.org/event/2024-06-14/m365-community-days-mtl-2024?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips Folders vs metadata to manage your content? **Folders** are a good solution to manage your content; moreover, if you are mainly working with OneDrive Sync (SharePoint library or OneDrive). It is simple to organize your content. The cons of organizing your content with folders are: - **Duplicated content**: a file can be duplicated between two or more folders. It becomes complicated to manage versions and merge information - **Deep structure,** and you can lose access to the content because the path to access the file exceedsthe limits - **Difficult to retrieve documents**: without additional information, SharePoint and Microsoft Search are based on a Full-Text search. The search can parse the content of the documents and, based on your search keywords, return the documents/results that contain these keywords **Metadata** are a "modern" and advanced solution to manage your content. Metadata are currently supported only via the Web UI of SharePoint or in the case of office documents (ex: Word), from the properties of the files. It is possible to assign unique or multi-value fields. In other words, it is possible to categorize one document in different categories (ex: "User File Type" column with values "Candidates, RΓ©sumΓ©") compared to the folders that you have to choose or duplicate the file in both of the folders. It is possible to create views with filters or groups to display your files. You can use metadata in the search and use them as refiners. Finally, following your licenses (ex: E5), you can assign sensitivity & retention labels. The cons of organizing your content with metadata are: - **Not easy to use** for non-advanced users who do not already have the habit of using metadata - **You cannot manage security/access** through metadata - **Cannot be used from Windows Explorer** when you sync a SharePoint library with your OneDrive for desktop - **Can be used in an immoderate way** when there are too many or mandatory fields What about taking the pros of both of them and using them at the same time? --- ## πŸ“° News SharePoint ### Section Content Vertical Alignment Basically, the content put in a section is positioned at the top. Now, you can choose to position the content at the top, middle, or bottom of the section. In other words, no need to add the Spacer Web Part anymore to align the content to the middle of your section in 2 or 3 columns 🀘 ![](https://blog.lsonline.fr/content/images/2024/06/Screenshot-2024-06-04-080919.jpg) --- OneDrive ### Open OneDrive from Outlook That can be tricky to explain this... From Outlook Web, users can now open their OneDrive directly while remaining in Outlook 🀯 That can be useful to avoid opening more tabs in the browser. ![](https://blog.lsonline.fr/content/images/2024/06/od-in-outlook.jpg) --- Stream ### Additional Analytics KPI Because you can now add Callout and Forms in your Stream videos, getting some information about their interactivity seems logical. A new tab is available from the Analytics area "Interactivity analytics," on which you can find this information: - **Unique video viewers**: Total number of people who have watched the video since it was published. - **Viewed interactivity**: Percentage of unique video viewers who viewed at least one interactivity in the video but did not necessarily interact with it. - **Engaged with interactivity**: percentage of unique video viewers who interacted with at least one interactivity in the video. - Avg interactions per viewer: Average number of interactions per viewer engaged with interactivity. - Avg attention time: Average time spent engaging with interactivity within the video. ![](https://blog.lsonline.fr/content/images/2024/06/Screenshot-2024-06-07-at-17.23.14.jpg) SharePoint ### New Text Web Part features Microsoft added some new amazing enhancements to maybe one of the most used Web Parts: **Text** 🀨 There are so many enhancements that I have to create a video for this, but a quick overview of these new features: - You can bypass the limitations of the text size by typing the size of the text manually - New bullet list style options - New numbered list style options (this one is maybe the most impressive improvement that needs a video to check all of them πŸ‘) ![](https://blog.lsonline.fr/content/images/2024/06/image.png) ![](https://blog.lsonline.fr/content/images/2024/06/image-1.png) ![](https://blog.lsonline.fr/content/images/2024/06/image-2.png) --- SharePoint ### Video Page Templates As announced by Microsoft, new page templates are available. These page Templates allow you to highlight your video content. Four templates are available - Starter: blank page with Stream Web Part - Training, recap & message: header image and title, video, quick links, text, people, and image Web Parts As with any page template, it allows you to save some time for the final users to create the page. But if you are using your templates, these ones do not bring added value. ![](https://blog.lsonline.fr/content/images/2024/06/Screenshot-2024-06-19-at-09.39.03.jpg) --- Stream ### New interactivity features In fact, no big changes, only UI changes to facilitate the life of users: - Color picker for the callout - Pick URL to existing files - when you click on "Add", the URL of the file is posted in the callout ![](https://blog.lsonline.fr/content/images/2024/06/Screenshot-2024-06-19-at-11.23.26.png) SharePoint ### Crop to Shape your Images Maybe one of my favorite features for this month 😍 I love creating pages and arranging the content to provide the best visual effect possible. The images have a real effect on the final users: - Include beautiful pictures to bring a better experience - Include useful pictures that can be practical because users memorize visuals - In the context of the content and in accordance with the organization's image So many good reasons to prefer using SharePoint pages rather than documents to sharing or explaining something. Preparing images was quite complex because if you wanted to resize, crop, change the format, or arrange your pictures in any way, you had to do it using software and upload the picture into SharePoint. Microsoft brought about a major change several months ago with the "advanced image editor", and now by adding the capability to crop pictures with useful shapes: - Original (no specific shape) - Circle - Triangle - Square - Hexagon - Peddle ⭐️ - Teardrop ⭐️ ![](https://blog.lsonline.fr/content/images/2024/06/Screenshot-2024-06-07-at-16.41.11.png) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - May 2024 URL: https://blog.lsonline.fr/2024/05/02/202405-msp-news/ Last updated: 2026-06-20T22:29:40.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [Groupe des Usagers Microsoft 365 - juin 2024 (100% Online), Tue, Jun 4, 2024, 6:00 PM | Meetup](https://www.meetup.com/guspquebec/events/300275708/?ref=blog.lsonline.fr) - [aMS Aix Marseille 11 juin 2024 – aMS Community](https://ams.community/ams-aix-marseille-11-juin-2024/?ref=blog.lsonline.fr) - [aMS Brazzaville 25/06/2024 – aMS Community](https://ams.community/ams-brazzaville-25-05-2024/?ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips Use Site Columns rather than list or library columns. There are different functional and technical reasons to prefer to create Site Columns. First of all, because you can reuse it more easily - no need to create a new column, just add it to the list/library, then you can organize the site column by content types. Technically, a site column is composed of an Internal name and a Display Name. The display name can be changed, but the internal name, once created, you can't (except programmatically). Choose to use the Pascal Case or underscores for the internal name (no special chars, spaces, accents, etc.). *Example: myAwesomeSiteColumn.* Finally, if you use the same site columns' internal name with different kinds of types (string, number, bool, yes/no), you have some risk of breaking the search and having some tricky behaviors. Site columns can avoid this. --- ## πŸ“° News SharePoint ### Brand Center (preview) Finally accessible in my environment, I can finally try this famous feature that allows you to add a brand to apply it to my SharePoint site. *I created this blog to set it up and create your package.* But basically, this feature is not so revolutionary. You can upload custom fonts and create a package that will be used in the different areas of a SharePoint site. It's important to note that this preview version answers clients' needs, which consist of adding additional fonts to be more compliant with their corporation or to let more capabilities and extend the imagination to create awesome branding integration. We need to wait a couple of times before seeing additional features as demonstrated by Microsoft. [SharePoint Brand Center - SharePoint in Microsoft 365Learn what SharePoint Brand Center is, how to set it up and manage it, and learn about brand assets.![](https://learn.microsoft.com/favicon.ico)Microsoft Learnmaggierui![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/en-us/sharepoint/brand-center-overview?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- SharePoint ### Custom Background Section It seems like Microsoft heard and handled it very fast πŸš€πŸ˜ The capability to add a background section was released last month, and we already have new features: - The most important one is the capability to specify a custom image as a background πŸ™Œ - More overlay by adding gradients and managing direction - Configure the image as well as the image Web Part capabilities - Select the fill mode of the background ![](https://blog.lsonline.fr/content/images/2024/05/sp-backSection-image-1.JPG) ![](https://blog.lsonline.fr/content/images/2024/05/sp-backSection-image-gradient-1.JPG) ![](https://blog.lsonline.fr/content/images/2024/05/sp-backSection-image-config.JPG) ![](https://blog.lsonline.fr/content/images/2024/05/sp-backSection-image-advanced.JPG) ![](https://blog.lsonline.fr/content/images/2024/05/sp-backSection-image-fillmode.JPG) Maybe more awesome options than expected ❀ --- SharePoint ### List Items OOTB Approvals Maybe you did it yourself, a Power Automate workflow that allows you to manage item approvals. This feature is now OOTB for all SharePoint lists (not available for "personal" lists in Microsoft Lists). From the SharePoint command bar, Automate > Configure Approval, you can enable the feature. Then, for each item, you can request approval from one or several people at the same time. The approvers have a notification from Teams, such as any approval requests in Microsoft 365\. The column is read-only ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-102537.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-102552.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-102640.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-102747.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-102910.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-114420.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-114351.png) Bookings ### New Home page More modern, fluid, and beautiful, the Microsoft Bookings home page gets a new look πŸ’‘ Nothing else 😁 I didn't detect any new major feature linked to this new look yet. ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-14-161311.png) --- Stream ### Trim your videos No need to use a video editor to be able to trim your Stream videos anymore. You can still use Clichamp for more capabilities, but just to trim your videos, you just need to click on the scissors from Stream and - Select the **Start** and **End** range or - Select **From** and **To** range to cut the middle part of the video The interesting point is that the cut part is "just hidden", but it is still possible to download the full video. ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-15-at-14.52.21.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-15-at-14.56.43.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-15-at-14.56.14.png) In the meantime, I just noticed that a Home icon is now available in the command bar. --- SharePoint ### Collapsed Section and Web Parts Heading Level The collapsed sections are not a new SharePoint feature, and to be honest, I love it 🫢 Really useful to reduce the size of a page and concentrate the user on expanded sections/content. It is possible to define a section title. This title, by default, was configured to be H2. Same things about the Web Parts. It is possible to specify a title, and by default, this one is configured to be an H2 one. It is now possible to specify a different heading level to be more compliant with the structure of your page for the sections and even for most of the Web Parts ❀ ![](https://blog.lsonline.fr/content/images/2024/05/sp-wp-headinglvl.JPG) ![](https://blog.lsonline.fr/content/images/2024/05/sp-section-titlelevel.JPG) --- SharePoint ### Graph API Pages Microsoft Graph was extended to be able to manage the SharePoint pages πŸš€ You can now create, edit, delete pages, and manage content. A really awesome capabilities addition to Microsoft Graph in the v1.0 version most over. To be able to launch this kind of request, you will need `Sites.ReadWrite.All` permissions and the SharePoint site ID, and if you are working on the site page content, the page ID. ```HTTP https://contoso.sharepoint.com/sites/{targetsite}/_api/site/id ``` REST API request to get SharePoint site GIUD ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-130612.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-24-130630.png) --- SharePoint ### New Version History Control (preview) A new feature that allows the management of the SharePoint files' version history. You can choose between: - Automatically - Manually define the number of major versions and the time before deleting versions This is a really useful feature to avoid old, obsolete versions. That allows us to reduce the number of versions and the size of the files. To be able to enable this feature, you have to enable it via PowerShell: ```PowerShell Set-SPOTenant -EnableVersionExpirationSetting $true ``` The users can see from the SharePoint interface a new column from the version history dialog box: `Expiring in` Can we hope that Microsoft will develop a new interface to manage the file history versions for end users (a modern panel, for example)? ![](https://blog.lsonline.fr/content/images/2024/05/image-2.png) ![](https://blog.lsonline.fr/content/images/2024/05/image-3.png) [Set-SPOTenant (Microsoft.Online.SharePoint.PowerShell)You can use the Set-SPOTenant cmdlet to enable external services and to specify the versions in which site collections can be created. You can also use the Set-SPOSite cmdlet together with the Set-SPOTenant cmdlet to block access to a site in your organization and redirect traffic to another site. Y…![](https://learn.microsoft.com/favicon.ico)Microsoft Learntrent-green![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/powershell/module/sharepoint-online/set-spotenant?view=sharepoint-ps&ref=blog.lsonline.fr#example-16) Microsoft Forms ### Pre-filled fields One of the most expected features with Microsoft Forms is to be able to pre-fill some fields. In fact, it works great. You can generate a link to access your forms with pre-filled fields, but this information is static. In other words, you can't generate a dynamic URL with some parameters (for example) to pre-filled fields based on another data source (ex: use Power Automate to generate a Forms URL based on a SharePoint list) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-14-163749.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-14-163810.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-14-163937.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-14-163958.png) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-14-164032.png) --- SharePoint ### Stream Web Part supports Playlist With the latest version of Stream, the "Classic" Stream Web Part for SharePoint has been deprecated and removed to make way for the new Stream Web Part. This new Web Part allows the display of a video folder, videos on the site, or a single video. To be able to display a Playlist, it was necessary to use the List Web Part, which allows the display of a SharePoint list view. Old story 😊 now, use the Stream Web Part, select Playlist, and choose the playlist that you want to use, then configure the next options related to the playlist, such as: - Layout - Sort ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-15-at-16.08.18.jpg) ![](https://blog.lsonline.fr/content/images/2024/05/Screenshot-2024-05-15-at-16.08.51.jpg) --- SharePoint ### Active Containers Once you have configured the SharePoint Embedded feature, you will see this new node in your SharePoint Admin center because SharePoint Embedded creates and registers Container Types > \[Warning\] Warning > This feature is currently in preview and once enabled you can revoke it. This admin page can currently only be used to delete or restore containers. [Set up and configure the SharePoint Embedded environment and web app project - TrainingIn this exercise, you’ll set up a project with a server-side REST API, authenticated through Microsoft Entra ID, to interact with SharePoint Embedded Containers via Microsoft Graph API, and a client-side single-page React app to display the contents.![](https://learn.microsoft.com/favicon.ico)Microsoft Learnandrewconnell-msft2![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/training/modules/sharepoint-embedded-create-app/3-exercise-set-up-configure-sharepoint-embedded?ref=blog.lsonline.fr) [SharePoint Embedded OverviewMicrosoft SharePoint Embedded is a cloud-based file and document management system suitable for use in any application. SharePoint Embedded is a new API-only solution that enables app developers to harness the power of the Microsoft 365 file and document storage platform for any app, and is suitable…![](https://learn.microsoft.com/favicon.ico)Microsoft LearnVesaJuvonen![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/sharepoint/dev/embedded/overview?WT.mc%5Fid=365AdminCSH%5Fspo&ref=blog.lsonline.fr#introducing-file-storage-containers) --- SharePoint/OneDrive ### PDFs Annotations Being able to display the content of PDF files is great, but being able to edit PDFs is better πŸ‘ In OneDrive and SharePoint, by opening the file and using the 'Edit', you can annotate / "draw" on the PDF files. Is it a beginning? Can we expect to be able to do more in the future (sign with a "drawled" signature, fill out forms, co-authoring, etc.)? ![](https://blog.lsonline.fr/content/images/2024/05/image.png) ![](https://blog.lsonline.fr/content/images/2024/05/image-1.png) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - April 2024 URL: https://blog.lsonline.fr/2024/04/17/202404-msp-news/ Last updated: 2026-06-20T22:31:18.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [Groupe des Usagers Microsoft 365 - mai 2024 (100% Online), Tue, May 7, 2024, 6:00 PM | Meetup](https://www.meetup.com/guspquebec/events/299306701/?notificationId=1368990565524643840&ref=blog.lsonline.fr) ## πŸ’‘ Trick & Tips Use SharePoint Content Types rather than metadata to identify the type of your documents. Thanks to the Content Types, you will be able to assign additional metadata, and the icing on the cake is that it is by default indexed and supported by the Search (as a refiner). Technically, the Content Types have no Internal Name, only an ID that looks like `0x0101...` and a Display Name. --- ## πŸ“° News SharePoint ### Sections Background This famous new feature that all of you have already heard of, isn't it? This feature adds the capability to change the background of a page section with color or, now, with a predefined image 😍 This is a good improvement, but maybe not sufficient in the short term because choosing his image can be more interesting. Next improvement? Noticed when you choose to use a background image, you can choose an overlay color and the opacity. With the chosen overlay, the color of the text changes to improve accessibility. ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-16-at-20.19.09-1.jpg) OneDrive ### New Media Section A new node in your OneDrive navigation named "Media" has just appeared in your OneDrive web. This one displays all videos and photos located in your OneDrive. All of them are sorted by the creation date. If you have a lot of photos and/or videos, this feature looks useful to have a quick overview of all of them. In addition to the hover of the cursor on a video, this one is played directly from the thumbnail πŸš€πŸ€© ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-16-at-20.16.00-1.jpg) --- SharePoint ### Reindex dialog box checkbox I didn't see any mention of this "new" behavior when you want to reindex a library or a site collection. Previously, from the advanced settings of a library or a site collection, you just had to click on reindex and then ok; now, you have to check an acknowledgment agreement about the stress that occurs to the search system before reindexing the library or site collection. ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-17-at-09.31.15.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-17-at-09.31.33.jpg) Loop ### OneNote Add your Loop components in OneNote πŸš€πŸ™Œ What can be the goal of adding a collaborative component when OneNote can be shared with a team for collaboration? - Because your assigned tasks from a tasks table component appear in your To-Do and not a OneNote tasks list πŸ’‘ - Because the components can be reused in different places (Outlook Teams, Whiteboard), and a OneNote page not Do you have more use cases? ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-17-at-07.16.13.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-17-at-07.16.25.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-17-at-07.17.35.jpg) --- Viva Engage ### The rise to the cloud.microsoft Since last month, Microsoft has begun the process of changing the domain name for Viva Engage. Previously, "https://web.yammer.com", some of you already realized that Viva Engage is accessible via the domain "engage.cloud.microsoft". You will find the list of services already available in the new unified domain name here: [Unified cloud.microsoft domain for Microsoft 365 apps](https://learn.microsoft.com/microsoft-365/enterprise/cloud-microsoft-domain?view=o365-worldwide?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). Here is a Microsoft blog post from last year that explains the concept: [Introducing Cloud Microsoft a Unified domain](https://techcommunity.microsoft.com/t5/microsoft-365-blog/introducing-cloud-microsoft-a-unified-domain-for-microsoft-365/ba-p/3804961?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr). ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-25-at-21.26.42.jpg) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - March 2024 URL: https://blog.lsonline.fr/2024/04/01/202403-msp-news/ Last updated: 2026-06-20T22:33:35.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [aMS Lausanne 5 avril 2024 – aMS Community](https://ams.community/ams-lausanne-5-avril-2024/?ref=blog.lsonline.fr) - [aMS Papeete 25 avril 2024 – aMS Community](https://ams.community/ams-papeete-25-avril-2024/?ref=blog.lsonline.fr) - [aMS NoumΓ©a 30 avril 2024 – aMS Community](https://ams.community/ams-noumea-30-avril-2024/?ref=blog.lsonline.fr) --- ## πŸ“° News OneDrive ### Template Files Popup Microsoft brought a huge new feature in OneDrive that replaced the "basic" dropdown to create folders, files, etc., with a new modal dialog that affords more capabilities: - On the left side, you keep your basic "links" to create folders, files, upload, etc. - You can choose where to create the new file πŸ’‘ - My files: create a new file in your OneDrive - Other locations: any SharePoint library that you have access - Templates: among the lists of templates provided by Microsoft, select which one you want to use and click "Edit in \[...\]" ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-08.07.50.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-09.06.33.jpg) --- SharePoint ### Upgrade Fluent Design You may have already noticed that some icons in SharePoint were changed. Microsoft is applying the latest version of Fluent Design. --- Loop ### Change Domain Name Currently [https://loop.microsoft.com/](https://loop.microsoft.com/?ref=blog.lsonline.fr) the service will have a new domain name at the end of April 2024. This new domain will be [https://loop.cloud.microsoft](https://loop.cloud.microsoft/?ref=blog.lsonline.fr). --- Microsoft 365 ### New Apps Launcher Microsoft changed the layout of the App Launcher! Rather than a left panel that takes the whole height of the page, now it is a "dialog". This new layout is available for most of the Microsoft 365 web apps. This dialog brings his little set of cool features: - **A search bar**: my favorite feature, because you don't have to click on **Microsoft 365** or **Explore all Apps** anymore - **Consistency:** The same apps are shown, in the same order, for each user. - **Create document**: if you select from this dialog a type of document, this one will be created directly in your OneDrive ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-11.26.30.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-11.29.06.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-11.26.47.jpg) Stream ### Support Hyperlinks In addition to the new features that allow to add more interactivity with the users: - Text inside a video - Microsoft Forms The text inside a video (callout) supports a hyperlink ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-09.51.19.jpg) --- Lists ### Forms feature Yes, this feature was announced a couple of times, but I was not able to use it before this month. Moreover, I can't see this feature in all the tenants that I have access to. This is an awesome feature 😍 you don't have to create a Forms and add a Power Automate to sync answers with your list... thanks to this feature, you just have to create your list, and then, with a simple click in the command bar, create a Forms directly connected to this list 🀯 I noticed some of the interesting points: - All types of fields are not supported (location, image, rating) - Forms link is for the organization only (not an external/outside organization). In other words, once you choose to share your list through this form, that creates a Sharing Link for all organization - You don't have all Forms features (background image, sections, relations between answers) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.34.38.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.34.44.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.35.38.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.43.04.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.35.57.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.35.52.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.41.48.jpg) ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.36.57.jpg) For more information: [Collect information like a pro New Microsoft Lists forms experience in Microsoft 365](https://techcommunity.microsoft.com/t5/microsoft-sharepoint-blog/collect-information-like-a-pro-new-microsoft-lists-forms/ba-p/4086659?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) Stream ### Automatic Transcription Have you already tried to generate a transcription from Stream? This feature is really useful if you want to add transcription/caption and translate it later (one of my main use cases is to translate French conversation into English or vice versa). Now, except for A1 or trial Tenant, you don't have to generate the transcription manually; the transcription will be automatically generated once the video is uploaded to SharePoint, Yammer, or Office.com. It is possible to disable this behavior by default with PowerShell: ```PowerShell Set-SPOTenant -MediaTranscriptionAutomaticFeatures Disable ``` ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-10.00.52.jpg) --- SharePoint ### New feedback button Previously visible at the bottom right corner, a button was available to send feedback to Microsoft. This button was moved to the Microsoft 365 bar. A better place to add this kind of button for Microsoft (I think πŸ€“). It is possible for the users to submit compliments, problems, or suggestions about SharePoint features and functionality to Microsoft πŸš€ ![](https://blog.lsonline.fr/content/images/2024/04/Screenshot-2024-04-01-at-21.29.09.jpg) *And so much new stuff is coming for next month 😁* Hoping this post will help you, see you next month... πŸš€ ### Microsoft List - Hide sensible column values URL: https://blog.lsonline.fr/2024/03/30/ms-list-hide-sensible-column-values/ Last updated: 2024-04-22T20:46:32.000Z In this blog post, we will see how it is simple to use Microsoft Lists/SharePoint lists to answer simple needs that could help you. Do you never have some information that you want to store in a list rather than an Excel file but have one or several values that should not be "clearly" visible when you are opening the list? Examples: - You have some logins and passwords that you want to share with some people on your team. *Of course, a password manager is more appropriate*. - You have a list of candidates with some personal information I'm sure, you who are reading this blog post have another interesting use case (do not hesitate to share them via a comment). What does it look like? **Before** ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-07-at-18.40.54.jpg) **After** ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-07-at-18.42.06.jpg) ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-07-at-18.42.18.jpg) Without taking more of your time, here is the JSON format to apply on a field/column of your list (any string field should work): ```json { "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json", "elmType": "div", "children": [ { "forEach": "choiceIterator in split(@currentField,'')", "elmType": "span", "txtContent": "*" } ] } ``` - **forEach**: need an array to loop on the index of it. This is why we are using `split` the current field for all chars `''` - **txtContent**: rather than displaying the chars of the value, we are displaying a `*` So simple isn't it? ? Now you can manage permission to the list or by item if you want to share all or a part of the items with someone else. Now it is your turn. Hoping this post will help you ? ### Monthly SharePoint News Digest - February 2024 URL: https://blog.lsonline.fr/2024/02/19/202402-msp-news/ Last updated: 2026-06-20T22:35:19.000Z **New month, new features for the Microsoft 365 Collaboration Tools ?** ## πŸ—“οΈ Events around Microsoft 365 - [Agenda 2024 - MWCP 2024 (modern-workplace.pro)](https://modern-workplace.pro/agenda-2024/?ref=blog.lsonline.fr) --- ## πŸ“° News SharePoint ### Advanced management \[PRO\] Improve the governance, security, and access to your environment thanks to these advanced features ![](https://blog.lsonline.fr/content/images/2024/03/Screenshot-2024-02-14-at-15.49.01.png) ![](https://blog.lsonline.fr/content/images/2024/03/Screenshot-2024-02-14-at-16.16.34.png) For more information, you can consult the Microsoft Learn page: - [https://learn.microsoft.com/sharepoint/advanced-management](https://learn.microsoft.com/sharepoint/advanced-management?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) - [Microsoft Syntex – SharePoint Advanced Management (SAM) Add-on – Announcing General Availability - Microsoft Community Hub](https://techcommunity.microsoft.com/t5/sharepoint-premium-blog/microsoft-syntex-sharepoint-advanced-management-sam-add-on/ba-p/3754188?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- SharePoint ### A Search Box OOTB? This month, I came across a new search box Web Part included in SharePoint. What can we suppose about that? Microsoft is looking to provide a Search Box to be included on our page without a third-party app. ![](https://blog.lsonline.fr/content/images/2024/03/Screenshot-2024-02-14-at-07.16.21.png) Stream ### Download from the view mode A *Download* button in the *View* mode of the Stream Web app for users with download permissions was added ![](https://blog.lsonline.fr/content/images/2024/03/Screenshot-2024-02-14-at-12.06.03.jpg) SharePoint ### No more Custom Script settings in OneDrive and SharePoint Next month, the Custom Script settings in OneDrive and the SharePoint web will be removed. It is possible to "postpone" this removal thanks to a PowerShell cmdlet until November 2024: ```PowerShell Set-SPOTenant -DelayDenyAddAndCustomizePagesEnforcement $true ``` Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - January 2024 URL: https://blog.lsonline.fr/2024/01/05/monthly-sharepoint-news-digest-january-2024/ Last updated: 2026-06-20T23:52:31.000Z **New month, new features for the Microsoft 365 Collaboration Tools ?** ## πŸ—“οΈ Events around Microsoft 365 - [aMS Strasbourg 18 janvier 2024 – aMS Community](https://ams.community/ams-strasbourg-18-janvier-2024/?ref=blog.lsonline.fr) --- ## πŸ“° News SharePoint ### Sharing Dialog box improvements The sharing dialog box continues to be improved, and this time, we can notice: - The new dialog box will be available for external users, too - The button to share the links by email/Outlook was removed from the footer; the link still exists, you must click on the *ellipsis* (β‹―) at the top of the dialog box - The new interesting thing is the tutorial that any user can launch to see the different features around the modern sharing dialog box - Click on the gear just to the right of the **Copy link** button to change the sharing settings ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-03-at-10.26.46.jpg) ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-03-at-10.27.02.jpg) --- Stream ### Interactivity feature So exciting to see this feature finally available ??? You can now add during a video: - Callout(s) - Form(s) Very useful in addition to Clipchamp! Create awesome and attractive videos, add dynamic callouts, hover them, and involve your users with a quiz ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.17.19.jpg) ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.23.12.jpg) ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.22.59.jpg) ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.23.53.jpg) ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.23.38.jpg) SharePoint ### Custom Library Templates As mentioned in November, creating a new document library based on the Microsoft Template was possible... The question was: Will it be possible to provide the organizational template(s) in the future? Now we have the answer: **Yes** A user account with at least a SharePoint administrator role can create an organizational template based on document library templates (based on template ID 101) and list templates (based on template ID 100). For admin, you can use this cmdlet: ```powershell Add-SPOListDesign -Title "LsOnline List Org List Template" -Description "Global List Template" -SiteScripts "00000000-0000-0000-0000-000000000000" -ListColor Red -ListIcon BullseyeTarget ``` For more information, check the Microsoft documentation: [https://learn.microsoft.com/powershell/module/sharepoint-online/add-spolistdesign](https://learn.microsoft.com/powershell/module/sharepoint-online/add-spolistdesign?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) End users can use this procedure provided by Microsoft: [https://learn.microsoft.com/sharepoint/lists-custom-template](https://learn.microsoft.com/sharepoint/lists-custom-template?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) SharePoint ### SharePoint news Templates Microsoft introduced specific page templates to be able to create compliance-responsive news (information mentioned in my September digest post). \- You can now engage your audience directly in their Outlook for Windows inbox and track their mail reads \- Microsoft extends the width of the news from 600px to 740px ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.03.25.jpg) --- SharePoint ### SharePoint Custom Page Templates Picker Tab Previously, the custom page templates were findable directly under the OOTB ones. Now, you have a **From Microsoft** tab and a **Saved on this site** tab. All custom templates are in the new S**aved on this site** tab. Moreover, if you defined a custom page Template by default, this new tab will be opened by default rather than the **From Microsoft** one. ![](https://blog.lsonline.fr/content/images/2024/02/Screenshot-2024-02-04-at-18.11.12.jpg) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - December 2023 URL: https://blog.lsonline.fr/2023/12/06/202312-msp-news/ Last updated: 2026-06-20T22:40:15.000Z **New month, new features for the Microsoft 365 Collaboration Tools ?** ## πŸ—“οΈ Events around Microsoft 365 ![Merry Christmas Happy Holidays GIF By DINOSALLY](https://media1.giphy.com/media/Rb5nY3V3zfqT7QOE4R/giphy.gif?cid=ecf05e47afxyqdvkicdswusqo8fc8z028aasfjraxcsvmhlo&ep=v1_gifs_search&rid=giphy.gif&ct=g) --- ## πŸ“° News Microsoft Viva ### Portal Have you already gone to: [https://viva.cloud.microsoft/](https://viva.cloud.microsoft/?ref=blog.lsonline.fr)? A sort of Viva portal to introduce you to the stack of tools provided by the Viva platform. Some tips & tricks are illustrated to help you get more information, stay focused, and improve efficiency in your everyday tasks. ![](https://blog.lsonline.fr/content/images/2023/12/image-2.png) --- SharePoint ### Still improving accessibility After the images, it is the turn of the Tables. In the option that you can access with a right-click, you can now access additional properties linked to accessibility. Do not forget that accessibility is always important. Microsoft put the accent on this, and this is a good thing. ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2023-12-19-at-13.38.28.png) ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2023-12-19-at-13.41.36.png) The accessibility encompasses all disabilities that affect access to the Web, including: - auditory - cognitive - neurological - physical - speech - visual A good post that explains it very well is available here: [Introduction to Web Accessibility | Web Accessibility Initiative (WAI) | W3C](https://www.w3.org/WAI/fundamentals/accessibility-intro/?ref=blog.lsonline.fr) Stream ### A Preview and an Edit mode In the future, when you open a video (Stream), you will open it in **View** mode. This mode prevents users from editing the video properties (ex: metadata, permissions, chapters, etc.). It is possible to switch to **Edit** mode to access all properties and change them at any time. ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-05-at-10.09.53.png) ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-05-at-10.09.39.png) --- Microsoft Search ### Create your own result layouts Microsoft Search is undoubtedly one of the best features in Microsoft 365\. You can find everything you access inside and outside your Tenant (check the connector for external content) from one search. In the previous version, Microsoft didn't allow the possibility to extend the visual/layouts of the search results. This year, Microsoft announced that you can create your own layout through Adaptive Cards. Now, with the latest update, Microsoft Search administrators can change result layouts for select SharePoint content using adaptive cards with the Result Type feature in Microsoft Search administration. ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-05-at-11.43.12.png) ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-05-at-11.43.48.png) ![](https://blog.lsonline.fr/content/images/2024/01/Screenshot-2024-01-05-at-11.50.52.png) --- SharePoint ### Videos and Highlight Content Web Part One feature that I totally missed... I caught the **Hero** web part, but it is possible to play the videos inline from the **Highlighted content** web part too. This functionality is enabled for web parts configured with Carousel or Filmstrip layouts and for 1-col and 2-col sections only. 0:00 /0:32 1Γ— Clipchamp ### Premium Features As you know, **Clipchamp** has been a part of the Microsoft 365 services for a couple of months, and it is a really good thing... I ❀️ Clipchamp with SharePoint and OneDrive... It is awesome. As Microsoft is doing with most of the services, you have a basic (not to say free) service and premium features (ex: MS Teams, SharePoint, Power Platform, etc.). What you can do without the Premium license: - Unlimited watermark-free exports: no indication that you made the video with Clipchamp - Up to **1080p (HD)** export resolution: HD resolution is not bad at all for creating video for the web, but if you are a video maker and want to provide a high resolution, unfortunately, this resolution can be a constraint - Free audio, image, and video stock media: a useful, limited palette of free media to add to your videos. For sure, if you want to go ahead, you will quickly struggle with the limited media - Free filters and effects: same as the media What are the premium features? You just have to note that premium features are in addition to the free ones: - Up to **4K (UHD)** export resolution: better resolution for video makers? - Premium audio, image, and video stock media: go ahead with more useful media to create beautiful videos - Premium filters and effects: same as the media part - ["Brand kit" for managing logos and colors](https://clipchamp.com/en/brand-kit/?ref=blog.lsonline.fr): create and reuse a kit that includes the image of your organization (logo, font, color HEX). So cool to quickly include your organization stuff. - Content backup: With Microsoft 365, this feature is not necessary because all content is stored in your SharePoint or OneDrive If you want more information about the new features or you want to know how to use them, here are some links: - [What's new in Clipchamp](https://clipchamp.com/en/whats-new/?ref=blog.lsonline.fr): all the new features are explained on the Clipchamp official website - [Clipchamp - YouTube](https://www.youtube.com/@clipchampcom?ref=blog.lsonline.fr): so many awesome videos that explain very well how to use Clipchamp and each feature. A special thanks to [@Paige](https://www.linkedin.com/in/paigecelliers/?ref=blog.lsonline.fr) for your awesome videos ❀️ Hoping this post will help you, see you next month... πŸš€ ### Speaking at MatomoCamp 2023 - November @Online URL: https://blog.lsonline.fr/2023/10/28/speaking-at-matomocamp-2023-november-online/ Last updated: 2025-03-14T12:47:39.000Z ![](https://blog.lsonline.fr/content/images/2025/03/Screenshot-2024-11-14-at-14.57.04.png) MatomoCamp experience This year, for the first time, I have the pleasure and the opportunity to speak at the [MatomoCamp 2023](https://matomocamp.org/?ref=blog.lsonline.fr) and will be presenting "**Introducing Matomo Analytics on SharePoint**". Even though SharePoint provides analytics dashboards, some basic features can missed. If your organization needs additional information about your SharePoint sites usage, you can use a tierce solution such as Matomo Analytics. A great alternative to Google Analytics on which you can have more control of your data. During this presentation, I will show you how to create a local Matomo server instance thanks to Docker and how to deploy a SharePoint extension for a modern site to be able to link it with your favorite analytics tool. I can't wait to show you this ? This edition will take place on November 10th, do not hesitate, it's FREE !! ### Monthly SharePoint News Digest - November 2023 URL: https://blog.lsonline.fr/2023/10/26/202311-msp-news/ Last updated: 2026-06-20T22:42:18.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [Your home for Microsoft Ignite](https://ignite.microsoft.com/en-US/home?wt.mc%5FID=ignite2023%5Fesc%5Fcorp%5Fbn%5Foo%5Fdocsbanner%5Fbigdocsbanner%5Fmslearn&ref=blog.lsonline.fr) - [Schedule - MatomoCamp](https://matomocamp.org/schedule/?ref=blog.lsonline.fr) --- ## πŸ“° News SharePoint ### Create a Document Library based on the OOTB Template Creating a library from existing ones was possible, but it was not possible to use existing Out-Of-The-Box ones. Moreover, thanks to the modal experience, such as the lists, it is possible to show a preview of the list structure (using metadata and format). Microsoft now provides three templates that you can use: - Media - Invoices - Learning ![](https://blog.lsonline.fr/content/images/2023/11/image.png) ![](https://blog.lsonline.fr/content/images/2023/11/image-1.png) ![](https://blog.lsonline.fr/content/images/2023/11/image-2.png) ![](https://blog.lsonline.fr/content/images/2023/11/image-3.png) Next step, create and provide your own Organizational templatesπŸš€πŸ˜πŸ«Ά --- Microsoft 365 ### SharePoint Add-In retirement in Microsoft 365 Important news for developers or any organizations that are using Microsoft Add-Ins. Here are some important dates provided by Microsoft to remind you: - Starting July 1st, 2024, SharePoint Add-Ins cannot be installed from the public marketplace, also referred to as a store by existing tenants. Installation from a private tenant catalog is possible. - Starting November 1st, 2024, new tenants will not be able to use SharePoint Add-Ins, regardless of their origin (public marketplace, private tenant catalog). - Starting April 2nd, 2026, Microsoft will remove the ability to use SharePoint Add-Ins for existing tenants. Lists ### UI Improvements Announced a couple of months ago, but I can only access these features now, the UI enhancements to improve the collaboration through your Microsoft Lists 🀩 What are these changes: - List views switcher - Co-authoring ![](https://blog.lsonline.fr/content/images/2023/11/image-5.png) --- Microsoft 365 ### Manage your files in Microsoft 365 Last month, a new feature was released to tag your content, whatever the source (OneDrive, SharePoint)... This month, Microsoft added the possibility to delete your files from portal.office.com or portal.microsoft.com ![](https://blog.lsonline.fr/content/images/2023/12/Screenshot-2023-12-05-at-18.13.57.jpg) --- OneDrive ### Open Video in Clipchamp Since the release of Clipchamp in Microsoft 365, several updates have been available to be able to edit videos quickly with significant features to improve your experience with this editor tool. From OneDrive, you can now open a video directly into Clipchamp πŸ˜πŸš€ ![](https://blog.lsonline.fr/content/images/2023/12/image-1.png) Whiteboard ### Integrate your Loop components to another level Using Microsoft Whiteboard during Teams meetings can be a powerful asset simply by drawing and sharing ideas directly through the same design table. To facilitate the collaborating experience, you can insert a Microsoft Loop component directly in your Whiteboard πŸ‘β€οΈ. Your tracking and sharing tasks or ideas become so simple. **Try it, and you will love it**! ![](https://blog.lsonline.fr/content/images/2023/11/image-6.png) --- SharePoint ### Right-click the SharePoint Table Did you know that to access table properties, you can use the right-click button? ![](https://blog.lsonline.fr/content/images/2023/12/image.png) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - October 2023 URL: https://blog.lsonline.fr/2023/10/26/202310-msp-news/ Last updated: 2026-06-20T22:43:45.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [aMS Tour SE Asia 2023 – aMS Community](https://ams.community/ams-events-in-south-east-asia-2023/?ref=blog.lsonline.fr) - [aMS Manila 24/10/2023 – aMS Community](https://ams.community/ams-manila-24-10-2023/?ref=blog.lsonline.fr) --- ## πŸ“° News SharePoint/OneDrive ### Clipchamp for work Improve your video content without additional tools and manage your video projects directly from Microsoft 365 πŸš€πŸ˜πŸ€©. This new feature is available from SharePoint and OneDrive. You can import content from your computer or OneDrive/SharePoint (select OneDrive), and once ready, save the content to Microsoft 365 or download it directly. ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-09.48.41.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-09.48.50.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-09.48.32.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-09.48.17.jpg) Here is a very basic example of what you can do to improve a Teams recording on which you want to remove some parts and improve the content *(I used a Teams meeting record and this website for the music* [*https://mixkit.co/free-stock-music/*](https://mixkit.co/free-stock-music/?ref=blog.lsonline.fr)*)* 0:00 /0:15 1Γ— [Clipchamp for Work | Microsoft 365Clipchamp, the new video editor from Microsoft 365, simplifies the task of editing video clips so you can easily create high quality videos at work.![](https://www.microsoft.com/favicon.ico?v2)Microsoft 365![](https://cdn-dynmedia-1.microsoft.com/is/image/microsoftcorp/LinkedIn-29?scl=1)](https://www.microsoft.com/en-us/microsoft-365/clipchamp-for-work?ref=blog.lsonline.fr) Stream ### Find your videos with Microsoft Search You can now find your videos thanks to Microsoft Search from: - Bing (work) - Microsoft365.com / Office.com - SharePoint ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-10.09.29.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-10.08.51.jpg) --- SharePoint ### Quick Links in a new Browser Tab A little new feature, that seems not really mentioned 😊 You can choose to open a link from your Quick Links Web Part to another tab of your browser. ![](https://blog.lsonline.fr/content/images/2023/11/image-4.png) Microsoft 365 ### Tag your content Organize all of your content from Microsoft.com / Office.com by tagging your items πŸ’‘ All items you can access from your account are displayed in Microsoft365.com / Office.com and can be organized with custom tags. The scope of the tags is only for your own usage (such as Outlook tags, for example) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-10.19.29.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-10.21.33.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-10.32.45.jpg) ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-26-at-10.22.39.jpg) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - September 2023 URL: https://blog.lsonline.fr/2023/08/16/202309-msp-news/ Last updated: 2026-06-20T22:46:09.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [aMS Lyon 14/09/23 – aMS Community](https://ams.community/ams-lyon-14-septembre-2023/?ref=blog.lsonline.fr) - [aMS Montpellier 28/09/23 – aMS Community](https://ams.community/ams-montpellier-28-septembre-2023/?ref=blog.lsonline.fr) --- ## πŸ“° News SharePoint/OneDrive ### Restricted Access Control for Sites For all these years, when you want to exclude users from accessing some SharePoint/OneDrive sites, it was necessary to use your brain hard to find a way to include only some users... πŸ€“ Sometimes a nightmare in a complex organization. This bad experience is almost done... You can enable a feature on your Tenant to be able to exclude some users from accessing specific SharePoint/OneDrive sites πŸš€πŸ’‘ ```PowerShell Set-PnPTenant -EnableRestrictedAccessControl $true ``` Once enabled (wait \~1 hour), you can set up exclusion access for specific sites: ```PowerShell Set-PnPSite -Identity https://contoso.sharepoint.com/sites/myproject -RestrictedAccessControl $true ``` Why do I say almost? It is because you need at least a P1 or P2 license for the user who is executing the cmdlet πŸ™„ [Restrict SharePoint site access - SharePoint in Microsoft 365Learn how to enable restricted access control for SharePoint sites.![](https://learn.microsoft.com/favicon.ico)Microsoft LearnMachelleTranMSFT![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/SharePoint/restricted-access-control?ref=blog.lsonline.fr) --- SharePoint ### The new Stream Web Part As mentioned a couple of months ago, the Stream (classic) Web Part was deleted by Microsoft in favor of a new Stream Web Part component. Rather than using the Lists component to display a list view from the Microsoft Lists (complicated to explain, isn't it?), you can use this Web Part and define the video(s) source: - Current site (all videos on the current site) - Folder (specify a folder that contains the videos to show) - Single video ![](https://blog.lsonline.fr/content/images/2023/09/image-1.png) ![](https://blog.lsonline.fr/content/images/2023/09/image-2.png) --- Microsoft Edge ### Split screen Are you bored with creating separate windows of Microsoft Edge to compare or have a look at websites side-by-side? You have a new icon in the MS Edge bar that allows you to split your favorite browser (MS Edge) into two separate screens. The only thing that you have to keep in mind, is currently, some extensions are not totally compatible with it. Ex: to fill out my login forms with Bitwarden, it does not work πŸ˜“ pretty sure your favorite extensions will be updated to scale in this new feature. ![](https://blog.lsonline.fr/content/images/2023/10/Screenshot-2023-10-02-at-20.39.53.jpg) SharePoint ### Copy SharePoint Page Just WOW πŸ™ŒπŸš€πŸ€― One of the features that will avoid scripts or any automation is the capability to copy a SharePoint page to another SharePoint site. ![](https://blog.lsonline.fr/content/images/2023/09/image.png) --- OneDrive ### Recommended filed *"OneDrive will now display a list of recommended files in Home. This list allows you to keep track of work around you and quickly access files with activity you value most, such as edits, mentions, and comments by people you interact with."* Always in the interest of quickly and easily finding the files we need on a daily basis, this functionality is very useful πŸ’‘ ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-12-at-08.10.41.jpg) --- SharePoint ### Site Creation UI The panel that normally allows users and administrators to create a new SharePoint is gone. The panel was replaced in favor of a dialog box. It not only replaces the panel here, but the dialog box allows the display of more information and allows you to select a SharePoint site Template (only available when you click on the "+" from a HUB site or SharePoint Admin) **User Interface** ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-07.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-06.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-04.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-05.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-02.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-01.jpg) **SharePoint Admin Interface** ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-09-1.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/MC650415-03-1.jpg) SharePoint ### New "news" templates from Microsoft In accordance with the new feature that allows sending pretty cool emails of SharePoint pages, we have new kinds of templates available. Be aware that these templates have one particularity: *you don't have access to all the existing SharePoint Web Part components*. That makes sense because the page must be compatible with most email clients. The list of Web Parts is: - Button - Divider - File and Media - Image - Link - People - Quick Links - Spacer - Text ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-06-at-15.33.30.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-06-at-15.44.59.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-06-at-14.38.04.png) ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-06-at-16.29.34.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-06-at-15.42.48.jpg) ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-06-at-15.48.27.jpg) --- SharePoint ### New Site Themes In addition to the existing native SharePoint themes, we can say welcome to the new themes: - Black - Cerulean ![](https://blog.lsonline.fr/content/images/2023/09/image-3.png) --- SharePoint ### Accessibility Cohesion 2/2 Mainly for web best practices, Microsoft includes some features to be able to stick these best practices with our SharePoint page. The previous month, it was the title levels, and now the **decorative images** *"... will be ignored by assistive technology, including screen readers. This addition has been made to the following: background image of the Title Region, images added inline with the Text Web Part, Image Web Part, Image Gallery, Hero, Call to Action, and Quick Links."*. Use the toggle accessible from the Web Part configuration panel to define an image as a decorative one. ![](https://blog.lsonline.fr/content/images/2023/09/Screenshot-2023-09-29-at-15.26.24.png) ### Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - August 2023 URL: https://blog.lsonline.fr/2023/08/10/202308-msp-news/ Last updated: 2026-06-20T22:48:29.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 ![tenor.com - Good Morning Summer GIF](https://media.tenor.com/rDbEp7zV1ykAAAAM/good-morning-summer.gif) --- ## πŸ“° News SharePoint/OneDrive ### Folders color Define a color to organize your folders in a SharePoint library. Basically, folders do not support metadata, but the files do - a new alternative consists of assigning a color to your folders to manage them visually only ![](https://blog.lsonline.fr/content/images/2023/08/image-8.png) ![](https://blog.lsonline.fr/content/images/2023/08/image.png) ![](https://blog.lsonline.fr/content/images/2023/08/image-1.png) ![](https://blog.lsonline.fr/content/images/2023/08/image-9.png) You can use the following API to do it programmatically: ```HTTP POST https://{site_url}/_api/foldercoloring/stampcolor(DecodedUrl=@a1)?@a1=%27%2Fsites%2Fmysite%2FShared%20Documents%2Fmyfolder%27 Accept: "application/json;odata=nometadata" Content-Type: "application/json;odata=nometadata" { "coloringInformation": { "ColorHex": "8" } } ``` > \[note\] Note > The color feature is not supported by Windows yet #### Table of colors | Color | Hex | Int | | ------------ | ------- | --- | | Yellow | #FFCE3C | 0 | | Grey | #B0B7BA | 8 | | Dark red | #E73E29 | 1 | | Light red | #FFBCB2 | 9 | | Dark orange | #EE7110 | 2 | | Light orange | #FFBF84 | 10 | | Dark green | #3F9F4A | 3 | | Light green | #8ED290 | 11 | | Dark teal | #27938E | 4 | | Light teal | #7AD1CD | 12 | | Dark blue | #1E84D0 | 5 | | Light blue | #86C8F7 | 13 | | Dark purple | #9A61C7 | 6 | | Light purple | #D4AFF6 | 14 | | Dark pink | #CC53B4 | 7 | | Light pink | #F7AAE7 | 15 | --- Lists ### Sharing List permission levels Basically, we can share a list with someone else as a reader or editor. But once someone has access as an editor to a list, this one can edit the properties of the list *(e.g. add/remove/rename a list column).* Another permission level exists that allows other people to edit items only (not the list configuration) ![](https://blog.lsonline.fr/content/images/2023/08/image-6.png) --- SharePoint ### Accessibility Cohesion Microsoft chose to ensure coherence between the technical and functional text formatting. Previously, when you select "Heading 1", technically behind it was an "H2". Technically, in web rendering, for accessibility, referencing, etc., you can only have one **H1** per web page. ![](https://blog.lsonline.fr/content/images/2023/08/image-13.png) ![](https://blog.lsonline.fr/content/images/2023/08/image-12.png) SharePoint/OneDrive ### Clipchamp is coming to SharePoint and OneDrive Currently available only for personal / Live accounts, Clipchamp will allow you to create and edit your recordings and videos more easily without tierce application, and it will be totally part of your Microsoft 365 environment ❀️ [Clipchamp for Work | Microsoft 365Clipchamp, the new video editor from Microsoft 365, simplifies the task of editing video clips so you can easily create high quality videos at work.![](https://www.microsoft.com/favicon.ico?v2)Microsoft 365![](https://cdn-dynmedia-1.microsoft.com/is/image/microsoftcorp/LinkedIn-29?scl=1)](https://www.microsoft.com/en-us/microsoft-365/clipchamp-for-work?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- Lists ### Rating field In the classic UI (legacy), it was possible to show the rating through a SharePoint list once the feature was enabled on the list. Since the Modern UI experience was released, this feature was not compatible with it. It is an old story now because Microsoft Lists supports the Rating list feature πŸ™ŒπŸ€©πŸš€ ![](https://blog.lsonline.fr/content/images/2023/08/image-5.png) ![](https://blog.lsonline.fr/content/images/2023/08/image-7.png) This feature is available by default on modern Team sites, but not for the communication ones. It is currently not possible to enable this feature from the SharePoint UI - it is necessary to enable the feature on the `site`thanks to PnP PowerShell or Microsoft 365 CLI with the ID: `915c240e-a6cc-49b8-8b2c-0bff8b553ed3` --- Teams ### What's new in the new Microsoft Teams Microsoft provides the new feature available in the new Teams experience. Among them, we can notice that if you have VoIP/PSTN configuration, you can finally use the Speed Dial. The other interesting feature, you can choose to use the "Classic" theme. The more important feature is that the new Teams supports app integration πŸ’‘ [What’s new in the new Microsoft Teams - Microsoft SupportFind out what’s new in Microsoft Teams for desktop, web, and mobile. Learn about new features and options and how to use them.![](https://prod.support.services.microsoft.com/apple-touch-icon.png)Microsoft Support![](https://support.content.office.net/en-us/media/7c72d964-d6ca-478a-a340-409ba5bf5792.png)](https://prod.support.services.microsoft.com/en-us/office/what-s-new-in-the-new-microsoft-teams-03f99a8a-0ba9-477c-af88-389d294425c3?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- Lists ### Export Data with Schema That is an awesome feature! Even for people who are not technical with SharePoint. **Question**: Okay, but... what is the "schema"? 🀨 **Answer**: The schema is the definition of your list - it includes the fields, the fields format (JSON format), Content Type(s), etc. **Question**: Okay, that sounds great, but can we create a new list from the existing one? πŸ€“ **Answer**: Yes, you can too. The export schema can afford you the possibility to have a backup, to share the configuration with another Tenant (because when creating a list from an existing one, the existing list must be on the same Tenant), for example. ![](https://blog.lsonline.fr/content/images/2023/08/image-10.png) ![](https://blog.lsonline.fr/content/images/2023/08/image-11.png) --- SharePoint ### New SharePoint page sharing experience Previously, you were able to share a SharePoint page from the command bar to Viva Engage (Yammer) or by email. Now, next to the"edit" button, you have new buttons: - Share (on the left) - Share page: share the item/page by sending an email or copying the link - Copy link to the page: copy link for existing access - Send to email - Site access (on the top) You can copy the link to the page from the page details panel too. ![](https://blog.lsonline.fr/content/images/2023/08/image-14.png) SharePoint ### Send a page to Yammer If you have a presentation of any training in your bag that talks about sharing a SharePoint page with Yammer, think about updating the picture and the content because the link to share a SharePoint page with Yammer was renamed Viva Engage. ![](https://blog.lsonline.fr/content/images/2023/08/image-2.png) --- SharePoint ### SharePoint Site Collection App Registration Control To connect to a SharePoint site, it is sometimes necessary to connect with something other than a user/password. It is possible to create an *Azure App,* but that can be overkill to access only one site. In a corporate environment, this kind of application to run scripts, for example, is generally refused by the IT admins, and rightly so. One other solution consists of creating a SharePoint app and specifying the scope of the rights of this app. This kind of app can be created by any *site collection admin* of a SharePoint site for the specified SharePoint site (or Tenant when is created by a SharePoint admin). For security measures, registering this kind of app can be created by the SharePoint Site collection admin ONLY if the SharePoint Tenant admin has explicitly authorized it. > \[info\] Important > > By default, the registration will be not authorized. It will be necessary to allow it to the Tenant The command to enable the SharePoint App registration is: ```PowerShell Set-SPOTenant -SiteOwnerManageLegacyServicePrincipalEnabled $true ``` > \[note\] Note > > PnP PowerShell already include the cmdlet [Granting access using SharePoint App-OnlyGranting access using SharePoint App-Only![](https://learn.microsoft.com/favicon.ico)Microsoft LearnVesaJuvonen![](https://learn.microsoft.com/en-us/media/open-graph-image.png)](https://learn.microsoft.com/en-us/sharepoint/dev/solution-guidance/security-apponly-azureacs?wt.mc%5Fid=MVP%5F386670&ref=blog.lsonline.fr) --- OneDrive ### A new way to browse your shared files Currently, from the *Home* and *Shared* files section of OneDrive, you have a search bar that allows you to filter the files by *file name or by person*. A new section from the left navigation allows you to access files by people or by meetings... Browse files by **meetings** is really useful to avoid a search from Teams when you don't remember the meeting, and **people's** view is useful when you know who shared or who is working on a file πŸ€πŸ’‘ ![](https://blog.lsonline.fr/content/images/2023/08/Screenshot-2023-08-21-at-09.19.34.png) ![](https://blog.lsonline.fr/content/images/2023/08/Screenshot-2023-08-21-at-09.36.25.png) ![](https://blog.lsonline.fr/content/images/2023/08/Screenshot-2023-08-21-at-09.36.46.png) ![](https://blog.lsonline.fr/content/images/2023/08/Screenshot-2023-08-21-at-09.36.54.png) ### Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - July 2023 URL: https://blog.lsonline.fr/2023/07/31/202307-msp-news/ Last updated: 2026-06-20T22:51:17.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 ![tenor.com - Good Morning Summer GIF](https://media.tenor.com/rDbEp7zV1ykAAAAM/good-morning-summer.gif) --- ## πŸ“° News OneDrive ### The new UI is here Microsoft revamps the OneDrive interface for the web ❀️ 1. OneDrive logos at the Microsoft 365 bar 2. New left navigation style 3. New "Add new" button 4. Collapse/expand left navigation 5. Add a new file filter search bar 6. Add a file type filter to "Shared with you" and "Favorites" 7. File filters and title in one line ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-31-at-15.51.50.png) ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-31-at-15.56.29.png) --- Mircosoft Forms ### New Start page The new Microsoft Forms start page is part of the Microsoft 365 environment and allow to display directly the groups with the number of forms linked to them ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-31-at-15.42.22.png) --- Yammer (Viva Engage) ### UI Improvements If you didn't like the Viva Engage (previously Yammer) interface, you must check again and see the interface improvement. Microsoft is revamping the Viva Engage UI, and it looks like more in accordance with Microsoft 365 than ever ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-26-at-09.15.53.png) ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-26-at-09.16.13.png) SharePoint ### Twitter web part retirement "Due to a change in Twitter’s terms of use for third-party access, the Twitter web part in SharePoint in Microsoft 365 will no longer be supported and will be removed from the web part toolbox, as well as from any Microsoft-produced site templates." - *mid-September* ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-31-at-16.03.19.png) --- Outlook ### Define your Office / Remote location If you have fixed days in the week when you are at the office or working remotely, you can define your location in your Outlook settings directly ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-26-at-09.27.28.png) --- SharePoint ### Some "Visual Refresh" Microsoft chooses to add radius for almost all visual Web Parts, such as: - Quick links - Events - Highlight content - etc. SharePoint ### News about SharePoint Home Site - Users are redirected to the Viva Connections admin center if trying to set up or manage a home site from the SharePoint Admin Center (SPAC) - Users are able to set multiple home sites by using multiple Viva Connections experiences in the M365 admin center. - It is possible to check and verify if you have access to the new Viva Connections admin center on the MAC. If so, you can refer to the Set up Viva Connections in the Microsoft 365 admin center for how to use the Viva Connections admin center [Learn more about this ⟩](https://learn.microsoft.com/en-us/sharepoint/home-site?ref=blog.lsonline.fr "Set a site as your home site") --- Microsoft 365 ### New Admin Center During these vacations, Microsoft chooses to put everything into the user interface; this time, the Microsoft 365 Admin Center has been a little upgraded by adding a new *command bar* ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-26-at-09.17.12.png) ![](https://blog.lsonline.fr/content/images/2023/07/Screenshot-2023-07-26-at-09.18.48.png) --- SharePoint ### User Profile Picture If you had the habit of editing your user profile picture from Delve by clicking on "How can I add additional information" (for example), you have to know that you won't do it in the future. Finally, Microsoft will improve user experience by providing a coherent profile photo experience across Microsoft 365 based on MS Graph endpoint and more especially via Microsoft People System (MPS). This is a great thing, because users without an Exchange license can not change their user profile picture in this way, and some Microsoft applications don't use this endpoint to get the user's profile picture. In the end, Microsoft will disable local uploads from SPO to the MySite host and instead enable centralized uploads to the Microsoft People System (MPS). Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - June 2023 URL: https://blog.lsonline.fr/2023/06/02/202306-msp-news/ Last updated: 2026-06-20T23:45:28.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [aMS Paris 6 juin 2023 – aMS Community](https://ams.community/ams-paris-6-juin-2023/?ref=blog.lsonline.fr) - [Tech Community Live | AMA for SharePoint, OneDrive, Lists, and Stream](https://techcommunity.microsoft.com/t5/sharepoint-events/tech-community-live-ama-for-sharepoint-onedrive-lists-and-stream/ev-p/3828994?ref=blog.lsonline.fr) --- ## πŸ“° News Microsoft Edge ### Collaborate with Workspaces Rather than sending a link for each site that you want to share with specific people or members of your team, you can create an Edge Workspace - all invited people can create new tabs, see who is connected to the workspace, see the Edge tabs that are visiting by users, see the new Edge tabs opened by the teammates... and so much more and all of this in live ![](https://blog.lsonline.fr/content/images/2023/06/image-1.png) ![](https://blog.lsonline.fr/content/images/2023/06/image-2.png) More information [here](https://learn.microsoft.com/en-us/DeployEdge/microsoft-edge-workspaces?ref=blog.lsonline.fr). --- SharePoint ### Display filter from the SharePoint view When you create a view with filters or select filters from the filter panel, all of them are listed at the top of the list. ![](https://blog.lsonline.fr/content/images/2023/06/image-8.png) Stream ### Home page improvements You can create a playlist directly from the Stream home page (rather than going to Microsoft List first), and you have quick access to Recording and Upload too. Have you already tried Stream Recording? Forget third-party apps to record your screen and make simple and quick effects... ![](https://blog.lsonline.fr/content/images/2023/06/image-3.png) --- SharePoint ### End of InfoPath 2013 As you already know, with the new/modern tools, Microsoft chose to not support InfoPath 2013 anymore in favor of Power Apps, Power Automate, or Forms. After **July 14, 2026**, users will no longer be able to use InfoPath forms in SharePoint Online. ![](https://blog.lsonline.fr/content/images/2023/07/ms-infopath2013-logo.png) Viva Connections ### Dashboard rearrange cards and mobile customization "AKA, people can personalize their mobile dashboard with the information that is most relevant to their work." ![](https://blog.lsonline.fr/content/images/2023/06/image-5.png) Hoping this post will help you, see you next month... πŸš€ ### Monthly SharePoint News Digest - May 2023 URL: https://blog.lsonline.fr/2023/05/09/202305-msp-news/ Last updated: 2026-06-20T23:47:21.000Z **New month, new features for the Microsoft 365 Collaboration Tools πŸš€** ## πŸ—“οΈ Events around Microsoft 365 - [\[May 2-4, 2023\] Microsoft 365 Conference](https://learn.microsoft.com/en-us/events/m365conf-2023/?ref=blog.lsonline.fr) - [\[May 23-25, 2023\] Microsoft Build](https://build.microsoft.com/en-US/home?ref=blog.lsonline.fr) --- ## πŸ“° News Stream ### Stream (Classic) Web Part Retirement The classic Web Part to display videos from Microsoft Stream will be retired on **Aug 15, 2023**. Users will not be able to add it anymore in SharePoint pages, but the existing page will still work until **February 2025**. ![](https://blog.lsonline.fr/content/images/2023/05/Screenshot-2023-05-30-at-09.04.52.png) You can find the Microsoft transition plan here: [Web part transition plan - Microsoft Stream | Microsoft Learn](https://learn.microsoft.com/en-us/stream/streamnew/webpart-transition?ref=blog.lsonline.fr) --- Microsoft Forms ### Users can edit answers after submitting Previously, when a user filled out a form and wanted to change the answers for any reason, the only way was to fill out the form once again (only if a person could submit more than one response). If only one response per person was configured, an owner should remove the previous response to let the user create a new response. Now, a user can edit an existing response πŸ’‘πŸ™Œ > \[Note\] **Note** > The feature needs to be enabled from the admin center `Settings > Org Settings > Microsoft Forms` ![](https://blog.lsonline.fr/content/images/2023/05/Screenshot-2023-05-30-at-11.12.18.png) ![](https://blog.lsonline.fr/content/images/2023/05/Screenshot-2023-05-30-at-11.19.11.png) --- SharePoint ### Use Editor to check spelling, grammar, and more You can choose to enable or disable Editor per page to check your page content ![](https://blog.lsonline.fr/content/images/2023/06/image-4.png) SharePoint/OneDrive ### SharePoint 2013 workflow retirement - Starting **April 2nd, 2024**, SharePoint 2013 workflows will be turned off for any newly created tenants. - Starting **April 2nd, 2026**, Microsoft will remove the ability to run or create and execute SharePoint 2013 workflows for existing tenants. --- Microsoft Bookings ### New URL for Microsoft Bookings share link This month, the URL to share a Bookings page that looks like `https://outlook.office365.com/owa/calendar//bookings/` will look like `https://outlook.office365.com/book//`. > \[Note\] **Note** > The previous URL still available - the customer will be automatically redirect to the new URL --- SharePoint/OneDrive ### "Simplified" Sharing Experience The dialog box when you are sharing content from SharePoint or OneDrive is totally redesigned... The "gear" allows you to change the type of sharing, and the box seems clearer. In addition, an excellent improvement is when you choose an external person to share with using a company link, and a prompt is displayed to confirm your choice. If confirmed, the link will automatically change from an internal-only link to a "Specific People" link, and you can simply proceed to share. Otherwise, an error message is displayed: "This link won't work for people outside of your organization." ![](https://blog.lsonline.fr/content/images/2023/05/Screenshot-2023-05-31-at-14.59.02.png) ![](https://blog.lsonline.fr/content/images/2023/05/Screenshot-2023-05-31-at-14.59.25.png) ![](https://blog.lsonline.fr/content/images/2023/05/Screenshot-2023-05-31-at-15.00.01.png) *Microsoft Roadmap Link:* [*Microsoft 365 Roadmap | Microsoft 365*](https://www.microsoft.com/en-US/microsoft-365/roadmap?filters=&searchterms=100713&ref=blog.lsonline.fr) --- SharePoint ### Create pages from anywhere The **SharePoint App Bar** has new actions from the "+" to create a *page* or a *news post* to the current site, and from the **SharePoint Start Page**, select the target site ![](https://blog.lsonline.fr/content/images/2023/06/image-6.png) Stream ### Uploading content to Stream (Classic) to be blocked On May 15, 2023, users will be blocked from uploading content to Stream (Classic) unless admins take action to delay this change. --- OneDrive ### Shared With You - More Powerful Rather than just returning the files from SharePoint or OneDrive that are shared with you, the new experience allows you to return, in addition to the files: - Files and folders over email - Chats - Meetings We'll note that the Activity column is visible too. ![](https://blog.lsonline.fr/content/images/2023/05/image-3.png) --- SharePoint ### Replace the Stream (classic) Web Part with the List Web Part As mentioned in this post, the SharePoint Stream (Classic) Web Part will be retired. To replace it, you can use the new **Playlist** list template and add it to your SharePoint page via the SharePoint **List Web Part**. ![](https://blog.lsonline.fr/content/images/2023/06/image.png) Hoping this post will help you, see you next month... πŸš€ ### Speaking at CollabDays - April 2023 URL: https://blog.lsonline.fr/2023/04/13/speaking-at-collabdays-april-2023/ Last updated: 2023-06-05T15:17:56.000Z This year and for the first time, I have the opportunity to speak at the CollabDays and I will be presenting "**Automatiser vos tests fonctionnels, une affaire pas bien compliquΓ©e**". During this presentation, I will show you why it is important to automatize functional tests and, thanks to TestCafΓ©, how you can create and launch them. End-to-end tests do not necessarily mean "we are developing something that we want to ensure is working" - this kind of test can be useful when you want to ensure your SharePoint configuration is still working, ensure the data audience and the security accesses for some users, the Web Part behavior in accordance with the quantity of data, performances, etc. You can choose to use someone to perform the tests based on a table (Excel file, SharePoint list, text file, etc.), check them, add screenshot(s) and comment(s), or create a bench test that you can launch automatically with no really advanced knowledge in development. The CollabDays will take place on April 28th. Do not hesitate to register for the event [here](https://www.collabdays.org/2023-montreal/register/?ref=blog.lsonline.fr), it's free - the places are limited ?. ### Monthly SharePoint News Digest - April 2023 URL: https://blog.lsonline.fr/2023/04/04/202304-msp-news/ Last updated: 2026-06-20T23:49:52.000Z As a consultant, when you are working on a technology that you don't manage the evolutions and changes, it is necessary to stay up to date and be one step ahead of your clients. Having this advantage allows you to prepare the support, test the functionalities before the users, and be ready for any questions from your colleagues and/or clients, and in the end, provide as many out-of-the-box solutions as possible. In my case, I try to keep an eye on the Microsoft 365 collaboration tools (mainly on SharePoint, OneDrive, Yammer, and Power Platform) updates, and as soon as I can see them in my environment, I take note of these changes in a dedicated SharePoint site. Each month, I share my notes with the [SharePoint User Group](https://www.meetup.com/guspquebec/?ref=blog.lsonline.fr) with examples and use cases to explain the pros and the things to consider. Rather than sharing this information during the *SharePoint User Group* only, I decided to share it each month through a **Monthly SharePoint News Digest**, and hope that it can help some of you ![Poke](https://statics.teams.cdn.office.net/evergreen-assets/personal-expressions/v2/assets/emoticons/poke/default/20_f.png?v=v34) and hope that it πŸ™πŸ» Thank you for the support of the community and for some people who believe in me and bring me advice as soon as they can. That's the power of a community: **Sharing Is Caring! ??** --- OneDrive / SharePoint ### Your Favorites It is now possible to designate files as favorites. Very useful when it comes to files that are often used or that you need to keep in view ![](https://blog.lsonline.fr/content/images/2023/05/obsp-01.png) ![](https://blog.lsonline.fr/content/images/2023/05/obsp-02.png) ![](https://blog.lsonline.fr/content/images/2023/05/obsp-03.png) You can find the Microsoft transition plan here: [Web part transition plan - Microsoft Stream | Microsoft Learn](https://learn.microsoft.com/en-us/stream/streamnew/webpart-transition?ref=blog.lsonline.fr) --- SharePoint ### The Web Part File Viewer was renamed SharePoint has a Web Part component that allows you to view a document directly from a page. The latter was called **File Viewer**. Its new nickname is now **File and Media** ![](https://blog.lsonline.fr/content/images/2023/05/image-1.png) --- Loop ### Preview version available Share and collaborate easily with Loop. [Microsoft Loop - Think, plan and create together![](https://loop.microsoft.com/fluid/prod/loop-app/hashed/assets/favicon/favicon-big.284a3c71f4.png)![](https://loop.microsoft.com/fluid/prod/loop-app/hashed/assets/app-preview/app-preview.149ab9046b.webp)](https://loop.microsoft.com/?ref=blog.lsonline.fr) Outlook (MacOS) ### Profiles Change your entire email environment in one click! Create profiles linked to one or more of your accounts and stay focused. ![](https://blog.lsonline.fr/content/images/2023/05/outlook-01.png) ![](https://blog.lsonline.fr/content/images/2023/05/outlook-02.png) --- SharePoint ### New page editing experience Over time, Microsoft is adding web part management functionality to the quick edit bar. The components that recently benefited from this feature are: - Quicklinks - Events - People - Hero - News - Title Region When a section is moved on the page, we can see the visual of the latter during the displacement. And many more features to come... ![](https://blog.lsonline.fr/content/images/2023/05/sp-exbar-01.png) ![](https://blog.lsonline.fr/content/images/2023/05/sp-exbar-02.png) ![](https://blog.lsonline.fr/content/images/2023/05/sp-exbar-03.png) ![](https://blog.lsonline.fr/content/images/2023/05/sp-exbar-04.png) ![](https://blog.lsonline.fr/content/images/2023/05/sp-exbar-05.png) ![](https://blog.lsonline.fr/content/images/2023/05/sp-exbar-06.png) SharePoint ### New SharePoint Site Templates Adds to the list of models: - Brand Central Other elements will arrive in the coming weeks... ![](https://blog.lsonline.fr/content/images/2023/05/image.png) --- SharePoint ### Export a list to Power BI Have you noticed that it is now possible to export a SharePoint list directly to Power BI? ![](https://blog.lsonline.fr/content/images/2023/05/image-2.png) Hoping this post will help you, see you next month... πŸš€ ### Using Resource Files with your Power Apps URL: https://blog.lsonline.fr/2022/05/02/using-resource-files-with-your-power-apps/ Last updated: 2026-01-27T18:56:25.000Z A lot of developed solutions use a resource file (sometimes more than one) to store the UI strings. There are reasons why this kind of file is used: - Encoding: the content of the files can be encoded (in UTF8 mostly) to avoid issues with the display of special chars - Only one place contains all strings - Reusable - No need to put the fingers into the code, mostly after several months to fix a typo - Facilitate the maintenance of the application - Easier to manage multilingual application - A developer can use it to be consumed by the code and the file can be easily shared with people, to perform proofreading or translations independently of the application life cycle With Power Apps, you can use several ways to do it. We will see two of them. ## Principle Whatever the solution, the base of the resource file is still the same: 1. **ID**: a unique identifier for technical purposes mainly (a number or a GUID). Use an incremental number beginning by `1` 2. **Lang**: mandatory if your application supports MUI. If your application does not support multilingual, it is not necessary. If you do not know it yet, or if your application can potentially supports other langs, it is preferable to use it 3. **Key**: the identifier used by the application to get the displayed string 4. **Value**: THE STRING that will be displayed in your application ### Example | ID | Lang | Key | Value | | -- | ---- | ------------ | -------------------------- | | 1 | en | BtnLogin | Login | | 2 | en | TitleWelcome | Welcome to our application | ## The SharePoint List The big advantage of this method is that it is easy to implement, and you can update the strings directly from a SharePoint list without editing the application - and anybody can do it. There are some points to consider: 1. Anybody who needs to access the application must have access to the SharePoint list in read-only mode at least 2. It is necessary to add a provisioning script or a list template to a dedicated SharePoint site for each application that uses this method 3. Using only one site collection for all applications, and can be an advantage 4. Using SharePoint becomes a prerequisite. Some easy applications do not need this 5. SharePoint can be slow to return the list item, and your application and the user experience can be affected 6. Because it is easy to add, edit or delete an item, it can therefore become dangerous. It is necessary to manage the different permissions levels and users with sufficient rights must be careful (well trained) 7. It can increase considerably the number of requests against the SharePoint service. If too many requests are sent, the SharePoint service can block some of them (threshold) Maybe some other technical points can be found. All this to say, use it sparingly ? > \[note\]Note > > However, a SharePoint list is really useful to store the settings of an application ## The Excel File Such as a lot of other kinds of applications, a file to store the strings can be used with Power Apps. There are some points to consider: 1. The Excel file can be embedded into the application (the size of the application will be increased in accordance with the weight of the resource file) 2. The Excel file can be called from a SharePoint site (one call to get a file). In my case, I can not successfully import an Excel file from a SharePoint site. Always the same error (I will update this post once I found a solution ?) 3. It is possible to share it and update it in the application directly or by updating the file from the SharePoint site (if the connector works) 4. Everyone knows how works Excel. It's much easier to explain how to maintain it than a SharePoint list (sometimes ? not need to have SharePoint skills) _This post is for subscribers only._ ### Speaking at Microsoft 365 Virtual Marathon - May 2022 @Online URL: https://blog.lsonline.fr/2022/04/12/speaking-at-the-microsoft-365-virtual-marathon-2022/ Last updated: 2026-01-27T18:56:22.000Z This year and for the first time, I have the opportunity to speak at the Microsoft 365 Virtual Marathon edition 2022 and I will be presenting "**Introduction Analytics SharePoint : comment ajouter des indicateurs sur vos sites SharePoint**". During this presentation, I will show you the native solution provided by Microsoft and three-third analytics tools: - Google Analytics - Matomo Analytics (Piwik) - Microsoft Clarity Since Google Analytics is known by a lot of people, I will focus on the Matomo Analytics solution installed locally through a Docker container and used via a SharePoint Framework extension. This edition will take place from 4-6 May. Do not hesitate to register for the event [here](https://www.m365virtualmarathon.com/?ref=blog.lsonline.fr) it's free ?. ### Speaking at aMS Lausanne 2022 - @Online URL: https://blog.lsonline.fr/2022/04/12/speaking-at-ams-lausanne-2022-online/ Last updated: 2026-01-27T18:56:20.000Z The [aMS community](https://ams.community/?ref=blog.lsonline.fr) is an international communityof professionals working on Microsoft 365 Platform that organizes several events across the world. This time, it is the opportunity for me to speak remotely at the convention that takes place in Lausanne, Switzerland. During this session, I will be presenting "**Introduction : ajouter des tests pour vos composants SharePoint Framework**". Together, we will see what kind of tests and the degree of helpful details for developers as well as the other tests that can help you ensure your components meet the acceptance criteria. In addition to this, we will see how to automate these kinds of tests on the most popular platforms such as GitHub, GitLab, and Azure DevOps. For more information about the sessions and the event, check the [official website](https://ams-lausanne-2022.sessionize.com/?ref=blog.lsonline.fr). ### Speaking at Canadian Cloud Summit 2022 - February @Online URL: https://blog.lsonline.fr/2022/02/05/speaking-at-canadian-cloud-summit-2022/ Last updated: 2026-01-27T18:56:15.000Z This year, for the first time, I have the opportunity to speak at the [Canadian Cloud Summit ](https://www.canadiancloudsummit.com/?ref=blog.lsonline.fr)edition 2022 and I will be presenting "**SharePoint Framework tests introduction**". More and more companies want some feedback and reports throughout the development of their SharePoint components - how can you implement tests to ensure that your components are still working and match the final users' requirements? Together, we will see what kind of tests as well as the degree of helpful details for developers and the other tests can help you to ensure your components meet the acceptance criteria. This session will expose the basics, the pros and cons of the implementation of unit tests (Jest), e2e (testcafΓ©) tests and how to automate them (DevOps CI). This edition will take place on February 17th, do not hesitate to register for the event [here ](https://www.eventbrite.com/e/canadian-cloud-summit-2022-tickets-174699229097?ref=blog.lsonline.fr) ?. **[Canadian Cloud Summit 2022 - SharePoint Framework Tests Introduction](https://www.slideshare.net/LaurentSittler/canadian-cloud-summit-2022-sharepoint-framework-tests-introduction?ref=blog.lsonline.fr "Canadian Cloud Summit 2022 - SharePoint Framework Tests Introduction")** from **[Laurent Sittler](https://www.slideshare.net/LaurentSittler?ref=blog.lsonline.fr)** ### How to manage the SharePoint Hub Sites associations URL: https://blog.lsonline.fr/2021/10/08/how-to-manage-the-sharepoint-hub-sites-associations/ Last updated: 2026-04-20T11:46:41.000Z Are you waiting for it? We are, too? The capability to associate a SharePoint Hub Site with another one. The good news is, the PowerShell cmdlet has existed for a couple of weeks now (at least): > The cmdlet to join a [#SharePoint](https://twitter.com/hashtag/SharePoint?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) hub to another hub exists, but it does not work on my environment ? I can’t wait ??‍♂️[https://t.co/TxLS4v0oDJ](https://t.co/TxLS4v0oDJ?ref=blog.lsonline.fr) [#Microsoft365](https://twitter.com/hashtag/Microsoft365?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) [#Office365](https://twitter.com/hashtag/Office365?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) > > β€” Laurent Sittler (@laul0\_68) [September 9, 2021](https://twitter.com/laul0%5F68/status/1436039253704810501?ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) and now, the cmdlet works ?? (currently on targeted environment only), and moreover, the SharePoint central admin allows us to manage the parent hubs too! ## What is a Hub Site? ![](https://blog.lsonline.fr/content/images/2021/10/LsOnline-Diagrams-SPHubSites.drawio-1.png) SharePoint Hub sites concept In short, a SharePoint hub site creates a relation between several SharePoint sites that brings you the capabilities to: - Have a "**global navigation**" between the associated sites in addition to the navigation per site - Enforce a **site theme** for the associated site - **Scope the data** across the associated sites - Perform **research scoped across the associated sites** - **Sync Hub permissions** (visitors only) to associated sites > \[note\] **Note** > > A tenant can host up to 2,000 hub sites max For more information, everything is well explained by Microsoft here: [What is a SharePoint hub site?![](https://support.microsoft.com/apple-touch-icon.png)![](https://support.content.office.net/en-us/media/762ddbe4-1240-4dbb-98af-d496c67339b3.png)](https://support.microsoft.com/en-us/office/what-is-a-sharepoint-hub-site-fe26ae84-14b7-45b6-a6d1-948b3966427f?ref=blog.lsonline.fr) ## What does a parent Hub site mean? ![](https://blog.lsonline.fr/content/images/2021/10/LsOnline-Diagrams-SPHubToHubSites.drawio-2.png) SharePoint Hub site with a parent hub site In theory (because while I am writing these lines, nothing changes), this kind of association should only: - **Scope the data** across the associated sites - Perform **research scoped across the associated sites** ## How to associate a Hub Site with another one? The parent hub association can be created only from the SharePoint admin center or via PowerShell cmdlet. ### PowerShell Before you begin, you must ensure that you have the following prerequisites: - The latest version of the [SharePoint Online Management Shell](https://www.microsoft.com/download/details.aspx?id=35588&ref=blog.lsonline.fr) - An account that has SharePoint admin credentials - Two SharePoint sites are registered as Hub sites Based on the above SharePoint sites schema, we have two Hub sites with the following information: | Site Name | URL | ID | | --------- | ------------------ | ------------------------------------ | | Intranet | /sites/intranet | 00000000-0000-0000-0000-000000000001 | | HR | /sites/intranet-hr | 00000000-0000-0000-0000-000000000002 | > \[success\] **Tip** > > To retrieve your SharePoint site Id, from your favorite browser, use the REST API URL `/sites/intranet/_api/sites/id` With this information in mind, we can now associate these two Hub sites - the intranet as the parent hub and HR as "sub-hub": ```PowerShell Add-SPOHubToHubAssociation -Source 00000000-0000-0000-0000-000000000002 -Target 00000000-0000-0000-0000-000000000001 ``` Associate a SharePoint Hub site to another one If for any reason, you need to disassociate a sub-hub, you can use the following cmdlet: ```PowerShell Remove-SPOHubToHubAssociation -HubSiteId 00000000-0000-0000-0000-000000000002 ``` Remove a Hub sites association ### SharePoint central admin From the SharePoint central admin, follow these steps to associate an existing Hub site to a parent Hub site: 1. Select the SharePoint "sub-hub site" from the "Active sites" list 2. Select the **Hub** tab 3. Click on **Edit hub site settings** 4. Select the parent hub site association 5. Click **Save** ![](https://blog.lsonline.fr/content/images/2021/10/Screen-Shot-2021-10-05-at-14.44.06.png) ![](https://blog.lsonline.fr/content/images/2021/10/Screen-Shot-2021-10-05-at-10.24.57.png) SharePoint admin center - Hub site settings ### Result From the SharePoint parent Hub site, you can see: ![](https://blog.lsonline.fr/content/images/2021/10/Screen-Shot-2021-10-05-at-14.52.56.png) ![](https://blog.lsonline.fr/content/images/2021/10/Screen-Shot-2021-10-05-at-14.53.00.png) SharePoint parent hub site settings panel From the SharePoint sub-hub site, you can see: ![](https://blog.lsonline.fr/content/images/2021/10/Screen-Shot-2021-10-05-at-14.52.49.png) Focus on parent hub site settings If you need more information about planning SharePoint hub sites in your environment: - [Planning your SharePoint hub sites - SharePoint in Microsoft 365 | Microsoft Docs](https://docs.microsoft.com/en-us/sharepoint/planning-hub-sites?ref=blog.lsonline.fr) Hoping this post will help you ? ### Speaking at aMS Strasbourg - October 2021 @Online URL: https://blog.lsonline.fr/2021/10/04/speaking-at-ams-strasbourg-2021/ Last updated: 2026-01-27T18:56:07.000Z The [aMS community](https://ams.community/?ref=blog.lsonline.fr) is an international communityof professionals working on Microsoft 365 Platform that organizes several events across the world. This time, it is the opportunity for me to speak at the convention that takes place in Strasbourg (in remote), a city where I spent several years as a student and got my first job as a SharePoint developer. In addition to that, I have the occasion to speak with [Fiona Fruhinsholz](https://twitter.com/FionaFruh?ref=blog.lsonline.fr), a Microsoft 365 consultant, specialized in users adoption, based in Lyon, France. During this session, we will be presenting "**De bonnes pratiques pour rendre SharePoint plus ludique**". Together, we will see feedbacks about governance rules, tricks & tips to apply to your SharePoint environment to help the maintenance and provide the best user experience. Do you know how to manage and organize access to your organization's intranet? What are the rules to link to your content and what are the limitations? and so much more... Functional and technical benefits, we will tell you everything! ? For more information about the sessions and the event, check the [official website](https://ams-strasbourg-2021.sessionize.com/?ref=blog.lsonline.fr). **[aMS 2021 - De bonnes pratiques pour rendre SharePoint plus ludique](https://www.slideshare.net/LaurentSittler/ams-2021-de-bonnes-pratiques-pour-rendre-sharepoint-plus-ludique?ref=blog.lsonline.fr "aMS 2021 - De bonnes pratiques pour rendre SharePoint plus ludique")** from **[Laurent Sittler](https://www.slideshare.net/LaurentSittler?ref=blog.lsonline.fr)** --- ### Create / Update ListItem Fields from PowerApps URL: https://blog.lsonline.fr/2021/08/20/create-update-listitem-fields-from-powerapps/ Last updated: 2026-01-27T18:56:03.000Z Sometimes I have to do some Microsoft projects with the Power Platform and more especially with Power Apps. Because I am not a master with it, I spend a considerable time to search some answers ? I decided to note all the points about how to create and update SharePoint item fields through a Power Apps application. ## Some notes before updating an item During my Power Apps projects, I noted some behaviors that I did not expect... So, I noticed them here ?. ### Change the Control Type of a field ![](https://blog.lsonline.fr/content/images/2021/05/LsOnline-msapp-change-fieldControlType-1.jpg) Change Control Type UI When the Control type of a field is changed, the DataCardValue number change at the same time. If some functions use this DataCardValue before changing the Control Type, think to update the DataCardValue number in the function too. > \[note\]Note > > It is not possible to change the "type" of the control (ex: text <> choice). The only way is to delete the existing field and replace it with the new one (if the type has changed on the SharePoint side) ### Create an item The first easiest method to create an item is to use a **Form** and the `SubmitForm()` ```Less SubmitForm(myItemForm); ``` Submit the form to create a new item This method is pretty easy to use and has the advantage to validate the form before sending the request. All fields that return an error will be highlighted with a red border and an error message. The validation of the form takes into account the configuration of the SharePoint list fields. But, if the submit function is not performed directly on the screen that contains the form, the highlighted fields are not persistent. **Example**: a form split into several screens; some fields are mandatory or have some constraints; the final screen performs the submit. If the user returns to a previous screen to fix the error(s), the specific field(s) in error won't be highlighted. > \[Success\] Tip > > To manage the fields with an error, use a **Collection** to store the name or internal name of each error field. Then, for each one of them, handle the highlight manually. The other method consists to use `Patch()`. It is not possible to send directly a **Form**. Each field must be manually specified, and of course, the form won't validate before and you are faced with the same problem for the highlight error fields. ```Less Patch( SharePointList, Defaults(SharePointList), { fieldOne: DataCardValue1.Text, fieldTwo: DataCardValue2.Text, ... } ); ``` Use Patch() to create a new item It is possible to check if the form is valid: ```Less If(myItemForm.Valid, "it is ok", "oups"); ``` Check if the form is valid or not or validate each field based on the data source constraints: ```Less If( IsBlank(Validate(SharePointList, spFieldInternalName, DataCardValue.Text)), "it is ok", "oups" ); ``` Check field validation in accordance with the data source ### Update an item `SubmitForm()` still working to update an item. The prerequisites are: 1. FormMode.Edit 2. Item must be specified It is possible to use `Patch()` also : ```Less Patch( SharePointList, First(Filter(SharePointList, ID = 10)), { fieldOne: DataCardValue1.Text, fieldTwo: DataCardValue2.Text, ... } ); ``` Use Patch() to update an item The `Update()` methods work in the same way (just replace Patch by Update). The big pro of this method is the `Filter()` and SharePoint list with more than 2000 items. Another alternative is to use `UpdateIf()`: ```Less UpdateIf( SharePointList, ID = 10, { fieldOne: DataCardValue1.Text, fieldTwo: DataCardValue2.Text, ... } ); ``` Basic usage of UpdateIf() - No filter condition - Easy to perform several conditions - Less code for several use cases ```Less UpdateIf( SharePointList, ID = 10 And 'Content Type'.Name = "CTOne", { fieldOne: DataCardValue1.Text ... }, ID = 10 And 'Content Type'.Name = "CTTwo", { fieldTwo: DataCardValue2.Text, ... } ); ``` Use UpdateIf() with several conditions It is so possible to create a new item from one form and update this new item with additional fields from another form for example: ```Less SubmitForm(myItemForm); If( // If the submit worked, the LastSubmit return the new item Not(IsEmpty(myItemForm.LastSubmit)), UpdateIf( SharePointList, ID = myItemForm.LastSubmit.ID And 'Content Type'.Name = "CTOne", { fieldOne: DataCardValue1.Text ... }, ID = myItemForm.LastSubmit.ID And 'Content Type'.Name = "CTTwo", { fieldTwo: DataCardValue2.Text, ... } ), false ); ``` Use SubmitForm() to create a new item and UpdateIf() to update it directly after creation Now with this information in mind, let's see how to send data in accordance with the field type. _This post is for subscribers only._ ### One or multiple Power Automate Flows? URL: https://blog.lsonline.fr/2021/08/07/one-or-several-power-automate/ Last updated: 2026-01-27T18:55:53.000Z If you are building or maintaining a solution that uses one big or multiple Power Automate flows, you are maybe wondering: What is the best choice, one big flow that does everything or several littler flows that do the same thing as the big one? Since I am a developer, first of all, I am used to use object statements and object models. What does it mean? - To manage an item/object life cycle, using a flag that allows determining the statement of this item. For example: | Statement | Description | | --------- | ----------------------- | | 1 | Created (default value) | | 2 | Waiting for approbation | | 3 | Approved | | 4 | Rejected | | 5 | Ready | | \-1 | Closed | - The object model consists in splitting the code/flow by logical context ## Before beginning Before you get started, it is important to be aware of the limits of Power Automate and the functional scope of this service: 1. Power Automate is a service especially scoped for the final users. That means that the flows work with the user account credentials and accesses. In other words, this kind of automation should not be used for application tasks. For application tasks automation, prefer the usage of Logic Apps 2. The performance varies in accordance with the user account license type (E3, E5, Premium, etc.) 3. The available connector varies in accordance with the user account license. You can quickly be struggling because you can not perform some actions that can seem simple (ex: HTTP requests) 4. The maximal number of triggers per user account. For a basic license (example: E3), 2 000 triggers per day. That can seem huge, but for a big application or an application used by a lot of users, this limit can be quickly reached 5. Duration and retention history limits are 30 days per-flow 6. and so much more... Check the Microsoft documentation for more information about the services: - Power Automate: [Limits and configuration - Power Automate | Microsoft Docs](https://docs.microsoft.com/en-us/power-automate/limits-and-config?ref=blog.lsonline.fr) - Logic Apps: [Limits and configuration reference guide - Azure Logic Apps | Microsoft Docs](https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-limits-and-config?tabs=azure-portal&ref=blog.lsonline.fr) ## Use Case: one big flow ![](https://blog.lsonline.fr/content/images/2021/06/LsOnline-MSPA-MultipleFlows.jpg) One Power Automate flow activity diagram | Pros | Cons | | -------------------------------- | -------------------------------------------------------------------------- | | One flow to manage and maintain | A lot of actions in the same flow | | No actions duplication | Longer execution time (timeout risk) | | No external statement (metadata) | Complicate debugging | | Sequential actions in order | Difficult even not possible to execute a part of flow only | | | If the same flow is too often used, Microsoft can disable it at any moment | | | Can reach the limit of nesting depth | ## Use Case: multiple flows _This post is for subscribers only._ ### Tools to check your PowerShell Code Quality and Coverage URL: https://blog.lsonline.fr/2021/06/04/tools-to-check-your-powershell-code-quality-and-coverage/ Last updated: 2026-01-27T18:55:49.000Z The main idea of this post is to gather a lot of **Open Source** tools together to check the Quality of PowerShell scripts and provide Code Coverage based on PowerShell Unit Tests. In my job, in order to manage a Microsoft 365 environment, it is necessary to use PowerShell to: - Access all features, even those which are not visible from the Admin UI - Implement Continuous Deployment - "Package" a set of configurations - Automation - etc. When developers develop, it exists some tools to ensure the quality of their code and perform Code Coverage. So why don't we do this with PowerShell scripts? Do some equivalent tools exist to check the PowerShell scripts and perform a Code Coverage? The answer is YES! ?? Ok, so let's go. In addition, to gather all of these tools together, I list the prerequisites and the information about their usage with personal feedback on their capabilities and efficiency. ## PowerShell Scripts Overview To be able to create reports of Code Quality and efficient Code Coverage for your scripts, you have to follow some Best Practices that are almost all illustrated in the Microsoft documentation: [Cmdlet Overview - PowerShellCmdlet OverviewMicrosoft Docsjoeyaiello![](https://docs.microsoft.com/media/logos/logo-powershell-social.png)](https://docs.microsoft.com/en-us/powershell/scripting/developer/cmdlet/cmdlet-overview?ref=blog.lsonline.fr) ## Code Coverage ### Pester ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-PowerShell-PesterConsole.jpg) Pester Code Coverage console result This is certainly the only tool that allows performing real code coverages: - Very similar to Jest and Mocha for React/JavaScript (SPFx) - A lot of samples and documentations - Exists for a couple of years - Relatively easy to use - Enough options to use it from the developer computer and from pipelines [Pester - The ubiquitous test and mock framework for PowerShell | PesterPester is the ubiquitous test and mock framework for PowerShell![](https://pester.dev/img/favicon.ico)PesterPester![](https://d33wubrfki0l68.cloudfront.net/6a60f48125860cf7af3c29be07288243a52a56d7/38eaf/img/logo_white.svg)](https://pester.dev/?ref=blog.lsonline.fr) _This post is for subscribers only._ ### SharePoint Framework Unit Tests - React URL: https://blog.lsonline.fr/2021/05/24/sharepoint-framework-unit-tests-react/ Last updated: 2026-01-27T18:55:45.000Z In my previous post that talks about [SharePoint Framework Unit Tests - TypeScript](https://blog.lsonline.fr/2021/03/01/sharepoint-framework-unit-tests-typescript/), the Enzyme tests were not a part of it. Jest allows you to perform the test against the TypeScript files only but not to cover the React part (`.tsx` files). To perform the React tests it is necessary to add another framework in addition to Jest - Enzyme. How do these kinds of tests work? Thanks to Enzyme, you can isolate, manipulate and simulate output tests against your React Components'. In other words, Enzyme generates a "fake" DOM to inject your component and manipulate it. > \[info\]Note > > This post is the continuity of [SharePoint Framework Unit Tests - TypeScript](https://blog.lsonline.fr/2021/03/01/sharepoint-framework-unit-tests-typescript/) ## Prerequisites - SharePoint Framework: **1.11.0** & **1.14.0** - NodeJS: **10.x** & **14.x** ## Setup The minimal setup to use Enzyme to perform the tests **against your React* files is: - Sample-based on the existing Web Part created on the post [SharePoint Framework Unit Tests - TypeScript](https://blog.lsonline.fr/2021/03/01/sharepoint-framework-unit-tests-typescript/) - For this example, you can keep the default React file located into `src/webparts/yourWebpart/component/` - Rather than creating a folder named *test*, I suggest you create a test file in the same location as the React (`.tsx`) one; create a file `**.test.tsx` with this content: ```TypeScript /// import * as React from 'react'; import { configure, mount, ReactWrapper } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; configure({ adapter: new Adapter() }); import { IHelloTestsProps } from './IHelloTestsProps'; import HelloTests from './HelloTests'; describe('Hello Tests', () => { let reactComponent: ReactWrapper; afterEach(() => { reactComponent.unmount(); }); it('should root web part element exists', () => { reactComponent = mount(React.createElement( HelloTests, { description: 'Description property value' } )); let cssSelector: string = '.helloTests'; const element = reactComponent.find(cssSelector); expect(element.length).toBeGreaterThan(0); }); }); ``` Sample of Enzyme test file ### NPM Packages Before configuring and executing the unit tests, it is necessary to install the Enzyme Framework packages, that allow running the React unit tests: - **SPFx 1.11.0** \- The Framework packages that allow running the unit tests: ```bash npm i enzyme@3.11.0 enzyme-adapter-react-16@1.15.6 @types/enzyme@3.10.8 @types/enzyme-adapter-react-16@1.0.6 --save-dev ``` - **SPFx 1.14.0** \- The Framework packages that allow running the unit tests: ```bash npm i enzyme enzyme-adapter-react-16 @types/enzyme @types/enzyme-adapter-react-16 jsdom-global jsdom --save-dev ``` > \[*info*\]Important > > \- The versions of the packages are very important with a SPFx solution (v1.11.0) > \- For the latest versions of SPFx, additional packages are required - If you reuse the same configuration as the previous post ([SharePoint Framework Unit Tests - TypeScript](https://blog.lsonline.fr/2021/03/01/sharepoint-framework-unit-tests-typescript/)), you can launch the tests with the bash command below: ```bash npm run test:jest ``` npm command to run Jest/Enzyme tests - If you launch the tests, this error should occur: ![](https://blog.lsonline.fr/content/images/2021/04/LsOnline-Enzyme-Tests-firstOutput.jpg) Error Enzyme adaptor ### Enzyme Configuration _This post is for subscribers only._ ### Speaking at Microsoft 365 Users Group - June 2021 @Online URL: https://blog.lsonline.fr/2021/05/06/speaking-at-microsoft-365-users-group-june-2021-online/ Last updated: 2026-01-27T18:55:39.000Z On the first Tuesday of each month, the community of the Microsoft 365 Users Group gathers to talk about the latest news around the Microsoft services and hands it over to someone who wishes to share a professional or personal experience around Microsoft 365. For this meeting of June 2021, I will introduce you to a sample of a solution to implement another way to perform tests. You may know Jest and Enzyme, two famous frameworks that allow performing technical and logical tests against the code of your SPFx components. But, what is the behavior of your SPFx component once displayed on a SharePoint page? Together we will see how to implement these kinds of tests with your SharePoint Framework components through a demo; see what are the benefits, the cons, the Framework alternatives, etc. This presentation is based on my blog post that you can find [here](https://blog.lsonline.fr/2021/04/15/using-testcafe-for-e2e-testing-your-spfx-solutions/). Don’t forget to register with the meetup event [here](https://www.meetup.com/guspquebec/events/273573815/?ref=blog.lsonline.fr). ### Using TestCafΓ© for e2e testing your SPFx solutions URL: https://blog.lsonline.fr/2021/04/15/using-testcafe-for-e2e-testing-your-spfx-solutions/ Last updated: 2026-01-27T18:55:34.000Z [Jest](https://jestjs.io/?ref=blog.lsonline.fr) coupled with [Enzyme](https://enzymejs.github.io/enzyme/?ref=blog.lsonline.fr) is certainly the best tool to perform visual/UI tests of your SharePoint solutions. But, if this is the best tool, why using the tools like **TestCafΓ©**? You can find additional information about Jest and Enzyme with SharePoint Framework in my posts: - [SharePoint Framework Unit Tests - TypeScript](https://blog.lsonline.fr/2021/03/01/sharepoint-framework-unit-tests-typescript/) - SharePoint Framework Unit Tests - React TestCafΓ© is a free, Open Source, and pureNode.jstool to automate end-to-end web testing. It works with any web browser or mobile device and cloud service like BrowserStack and SauceLabs. If you know [Cypress](https://www.cypress.io/?ref=blog.lsonline.fr), TestcafΓ© can be a great alternative. [A node.js tool to automate end-to-end web testing | TestCafeUse TestCafe to write tests in JS or TypeScript, run them and view results. TestCafe runs on Windows, MacOS, and Linux and takes 1 minute to set up.![](https://devexpress.github.io/testcafe/apple-touch-icon.png)TestCafe![](https://raw.githubusercontent.com/DevExpress/testcafe-gh-page-assets/master/src/images/testcafe-ogp-icon.png)](https://devexpress.github.io/testcafe/?ref=blog.lsonline.fr) This kind of **End-to-End** testing framework allows you to have: 1. **a visual**! In my opinion, this is the main reason to choose an e2e Framework versus a Jest + Enzyme. If you need to see the results, check the tests in real-time, take screenshots and record videos automatically, etc. 2. **no isolated tests**. Unlike Jest + Enzyme, all the tests are performed directly on the platform (a SharePoint site in our case). That means that you can ensure the behavior of your component match with the SharePoint interface rather than isolated tests In conclusion, this kind of framework can be really useful and helpful to validate or debug the UI of your solution. Personally, I will include granularly these tests via TestcafΓ© in my existing and new SharePoint Framework solutions ??‍? > \[warning\]**Important** > > The e2e tests do not realize a code coverage. If you want a code coverage, you can use the e2e tests and the Jest framework. ## How to Install TestCafΓ© into your SPFx Project _This post is for subscribers only._ ### How to Deploy & Manage your Ghost Theme with any Pipeline URL: https://blog.lsonline.fr/2021/04/14/how-to-deploy-manage-your-ghost-theme-with-any-pipeline/ Last updated: 2026-01-27T18:55:29.000Z Ghost is a free and open-source blogging platform. You can use the default, an existing free or paid theme, or build your own one. If you are reading this post, it is because you are thinking of using Ghost or you are already using it and you are looking to implement a *Continuous Integration* of your theme. To deploy a Ghost theme, exists several ways to achieve this goal. ## Manually deployment This method is really easy and can be considered if you choose to use a paid theme or a free one that is not frequently updated. This method consists of uploading the package (zip file) for each new version of the theme via the Ghost admin interface to overwrite the previous one: ![](https://blog.lsonline.fr/content/images/2021/03/LsOnline-GhostThemeCI-GhsotAdminManuallyUpload-1.png) Upload theme from Ghost Admin UI As you can imagine, if you choose to deploy frequently your own theme, this method can become quickly tedious. ## Use FTP access to Update Files When I created my first Ghost theme, I created the first version and uploaded it to my Ghost blog. I quickly understood that it will not be possible to upload a new version manually for each change especially at the beginning; when you create a new theme, you will improve it and fix several little issues. Once you upload your theme, Ghost creates a folder located at `/var/lib/ghost/content/themes//` (when you use the Docker image). Once the folder is created, it is possible to change each file directly into this folder to update your theme. With this information in mind, you can create FTP access to this folder and create a pipeline, a scheduled task, a flow, or whatever to upload the new versions of the files into this folder directly. One more thing ☝? In production mode, template files are loaded and cached by the server. For any change in a `hbs` file to be reflected, you must restart your Ghost service by command line or by restarting your Docker container. ## GitHub Action As a developer, you use a repository to store your code and the versions of it ☺️ If this repository happens to be stored into GitHub, the Ghost team has created a GitHub Action to set up a simple continuous integration of your Ghost theme to deploy it directly to your Ghost website ?? [GitHubSet up simple continuous integration of your Ghost theme to deploy directly to your Ghost website with GitHub Actions. Share code snippets with GitHub Gists ?‍?Ghost - The Professional Publishing Platform![](https://ghost.org/images/meta/Ghost-Integrations.jpg)](https://ghost.org/integrations/github/?ref=blog.lsonline.fr#:~:text=GitHub%20Actions%20allow%20you%20to%20build%20simple%20automation,create%20a%20new%20custom%20integration%20called%20GitHub%20Actions%3A) This method is the best way to update your Ghost theme automatically without any additional manual action. But, what happens if you are not using GitHub? Let's see the last part of my post ? ## Use Ghost API [Ghost Content API DocumentationGhost’s RESTful Content API delivers published content to the world and can be accessed by any client to render a website. Read more on Ghost Docs.Ghost - The Professional Publishing Platform![](https://ghost.org/images/meta/Ghost-Docs.jpg)](https://ghost.org/docs/content-api/?ref=blog.lsonline.fr#:~:text=Ghost%E2%80%99s%20RESTful%20Content%20API%20delivers%20published%20content%20to,complex%20filters%20are%20made%20simple%20with%20our%20SDK.) Whatever the environment on which you are working, GitHub, GitLab, DevOps, etc. from the moment you can trigger a pipeline it is possible to create a Continuous Deployment and update automatically your Ghost theme quite easily. Based on the Gulp file available on the [Casper](https://github.com/TryGhost/Casper?ref=blog.lsonline.fr) theme, it is easy to add a `npm` task to deploy your theme. The most important part before deploying a theme package is the `zip` task. ### Create a Zip To create the zip package, execute the `npm` command below: ```bash npm run zip ``` ### Add Deploy Task To add the deployment task, you must edit the `gulpfile.js` by adding: ```JavaScript ... async function deploy(done) { try { const url = process.env.GHOST_API_URL; const admin_api_key = process.env.GHOST_ADMIN_API_KEY; const themeName = process.env.THEME_NAME || require('./package.json').name; const apiVersion = process.env.API_VERSION || require('./package.json').engines['ghost-api']; const zipFile = `dist/${themeName}.zip`; const api = new GhostAdminApi({ url, key: admin_api_key, version: apiVersion }); await api.themes.upload({ file: zipFile }); await api.themes.activate(themeName); done(); } catch (err) { handleError(done); } } ... exports.deploy = deploy; ``` Additional task into Casper gulpfile.js file This JavaScript function allows you to upload the Ghost theme zip file and activate this one. > \[note\]**Note** > > Create the zip file is a prerequisite. To ensure the task that allows to create the zip file has been executed, it is possible to change the export by `exports.deploy = series(zip, deploy);` > \[info\]**Important** > > This sample uses the Ghost v4 API Then, edit the `package.json` file by adding a new `scripts` node: ```JSON ... "scripts": { ... "deploy": "gulp deploy" }, ... ``` Add the deploy task into package.json ### Environment variables To deploy the theme into your Ghost site, you must specify some environment variables for your pipeline: - **GHOST\_API\_URL**: this is the URL of your Ghost site. Example: `https://blog.mydomain.com` - **GHOST\_ADMIN\_API\_KEY**: this is an Admin Key generated from the Ghost admin interface (as explained from the GitHub Action) Once your zip file is ready and your variables defined, you can launch the deployment from your pipeline by executing the `npm` command below: ```bash npm run deploy ``` #### Test locally Now that your solution can be deployed from a pipeline, here is a solution to test the deployment locally. The best way is to create a `.env` file at the root folder of the solution with the following content: ```plaintext GHOST_API_URL=http://fluent-ui.local GHOST_ADMIN_API_KEY= ``` .env file to simulate environment variables To manage `.env` file, it is necessary to install `dotenv` module and add some lines into the `gulpfile.js`. First of all, install the new dev dependency: ```bash npm i dotenv --save-dev ``` Add 'dotenv' module dependency To be able to read the `.env` file, add the following lines under all imports: ```JavaScript const path = require('path'); const ENV_FILE = path.join(__dirname, '.env'); const env = dotenv.config({ path: ENV_FILE }); ``` Raad '.env' file from gulpfile.js Last one thing! it is necessary to update the `deploy` task from `gulpfile.js` like this: ```diff async function deploy(done) { try { - const url = process.env.GHOST_API_URL; + const url = process.env.GHOST_API_URL || env.parsed.GHOST_API_URL; - const admin_api_key = process.env.GHOST_ADMIN_API_KEY; + const admin_api_key = process.env.GHOST_ADMIN_API_KEY || env.parsed.GHOST_ADMIN_API_KEY; const themeName = process.env.THEME_NAME || require('./package.json').name; const apiVersion = process.env.API_VERSION || require('./package.json').engines['ghost-api']; const zipFile = `dist/${themeName}.zip`; const api = new GhostAdminApi({ url, key: admin_api_key, version: apiVersion }); await api.themes.upload({ file: zipFile }); await api.themes.activate(themeName); done(); } catch (err) { handleError(done); } } ``` Edit 'deploy' task to support variables from '.env' file Here you go! You just have to launch the following command to deploy the theme manually: ```Bash npm run zip npm run deploy ``` I am using this solution for my own Ghost theme. You can find this configuration on my repo, here: [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Ghost - Fluent UI Theme ](https://gitlab.lsonline.fr/ghost-themes/ghost-fluent-ui?ref=blog.lsonline.fr) Happy deployment ??? Hoping this post will help you ? ### SharePoint Framework Unit Tests - TypeScript URL: https://blog.lsonline.fr/2021/03/01/sharepoint-framework-unit-tests-typescript/ Last updated: 2026-01-27T18:55:22.000Z The Unit Tests and Code Coverage can seem complicated to be implemented into your SharePoint Framework components; the time of implementation of this kind of automation can seem excessive compared to the obtained result. Adding unit tests can take some time especially if the developer does not have the habit to do it. The aim of this post is to bring out the prerequisites, the environment, the use cases, and the benefits. In fact, some blog posts about that already exist, but I did not find any of them enough complete and some of them were deprecated (SPFx 1.7.0 for some of them). Based on my experience, every time I tried some tutorials and samples, it did not work as expected and I spent a lot of time searching for solutions. Now, I created a standard setup that I am using for all of my components as much as possible. It is important to note that it is very difficult to perform unit tests on the controller (ex: `...WebPart.ts`) due to the complexity of the object class. The best way to do it is to split your *custom* code into other files and consume them from the controller. ## Prerequisites - SharePoint Framework: **1.11.0** & **1.14.0** - NodeJS: **10.x** & **14.x** ## Setup The minimal setup to use Jest to perform the tests on the *models* and *basic* TypeScript files. - Create a new Web Part component based on the **React** Framework - For this example, you can create a `model` folder located into `src/webparts/yourWebpart/` - Create a `SharePoint.ts` file with the following content: ```TypeScript enum EnvType { 'Online', 'On-Premise' } export default class SharePoint { private _env: EnvType; private _version: string; constructor() { this._env = EnvType.Online; } public get env(): EnvType { return this._env; } public set env(value: EnvType) { if (undefined == EnvType[value]) { throw TypeError('EnvType is out of range.'); } this._env = value; } public get version(): string { return this._version; } public set version(value: string) { this._version = value; } } ``` - Rather than create a folder named *test*, I suggest that you create a test file in the same location; create a file `SharePoint.test.ts` with this content: ```TypeScript /// import SharePoint from './SharePoint'; describe('SharePoint model', () => { it('should create a SharePoint instance', () => { let s = new SharePoint(); expect(s).toEqual({ _env: 0 }); }); it('should set SharePoint._env to the passed argument \'1\'', () => { let s = new SharePoint(); s.env = 1; expect(s).toEqual({ _env: 1 }); }); it('should throw an error when EnvType is out of range', () => { let s = new SharePoint(); expect(() => { s.env = 3; }).toThrow(TypeError); }); it('should return the \'env\' value when the getter \'env\' called', () => { let s = new SharePoint(); expect(s.env).toEqual(0); }); it('should set SharePoint._version to the passed argument \'15.0.4693.1000\'', () => { let s = new SharePoint(); s.version = '15.0.4693.1000'; expect(s).toEqual({ _env: 0, _version: '15.0.4693.1000' }); }); it('should return the \'version\' value when the getter \'version\' called', () => { let s = new SharePoint(); s.version = '15.0.4693.1000'; expect(s.version).toEqual('15.0.4693.1000'); }); }); ``` ### NPM Packages Before configuring and executing the unit tests, it is necessary to install several packages: _This post is for subscribers only._ ### SharePoint Client Side Page Author URL: https://blog.lsonline.fr/2021/02/28/sharepoint-client-side-page-author/ Last updated: 2026-01-27T18:55:20.000Z The main concept of SharePoint did not change through these last years; by default, all members can write on a SharePoint site, drop files, create content and pages. Since the arrival of the modern pages, some notions are more "obvious", as the page author one. Programmatically, you can access `Author` and `Author Byline` metadata, but what is the main difference, and what is the impact? ## Author Byline ![](https://blog.lsonline.fr/content/images/2021/02/LsOnline-SP-AuthorByliine.jpg) SharePoint Page - Author Byline The author's byline is mostly used as an indication for the readers about who is the original author of the contents and not necessarily who wrote the page. Specifying the author byline does not grant any additional access or feature for this user. This can be useful when you have some marketing people who have the habit to write content and can specify the "author byline" who at the origin, does not have this habit. As you can see, you can easily edit it from the SharePoint interface and even choose to keep it empty. > \[note\]**Note** > > The internal name of this field is `_AuthorByline` ## Author Regarding the author, it is totally different. The field that stores the information about the author of the page is also called `Created By`. From a SharePoint list/library view, you should display **Created By** field to see who created an item. Contrary to the *Author Byline*, this field is not visible from the edit page or from the form of an item. This one cannot be edited from the item form or a quick edit view neither. Apart from being identified as the creator of a page, this one will receive notifications when: - Someone liked the page - Someone wrote a comment ![](https://blog.lsonline.fr/content/images/2021/02/LsOnline-Author-Like.jpg) ![](https://blog.lsonline.fr/content/images/2021/02/LsOnline-Author-LeftComment.jpg) SharePoint email notifications to the author when another user likes a page or lets a comment The main issue of the native behavior can become restrictive for many reasons: - The user account that creates the page, creates a lot of other pages. Thus, this one will receive a lot of notifications... spammm - The account used to create pages is a service account (no mailbox)... This means no notification - Another user account that did not create the page should receive the notification (delegation) - A group of users (Office 365 or security group with mail address) should be notified and not only the user account that creates the page With this information in mind, you could ask: "*Ok, I need to change the value of this metadata, how can I do that?* ?" > \[note\]**Note** > > The internal name of this field is `Author` ## Scripts to Update Author Create a script to update the **Author** for one or several pages (even an items list) can be a good option. Below, different samples to update this field via PowerShell, bash, and REST API. You will note that **Editor** is also specified in the samples. This is totally normal because if you do not specify the editor, the action returns an error (it is possible to specify another user account than the author one). The cons of the scripts method are: - You need to execute manually the script to update one or several pages - You need to set up a scheduled task that will update the author of the pages at the same frequency _This post is for subscribers only._ ### Fluent UI and Ghost URL: https://blog.lsonline.fr/2021/01/11/fluent-ui-and-ghost/ Last updated: 2026-01-27T18:55:16.000Z I recently changed my custom Ghost blog theme based on [Casper](https://github.com/TryGhost/Casper?ref=blog.lsonline.fr) to Fluent UI. I will explain to you my motivations and what I included in the first version of this theme. Fluent UI Ghost theme is based on the Microsoft front-end framework and the SharePoint modern site design. This theme provides some similar experiences for Microsoft 365 bloggers who are familiar or experts with the Microsoft environment. ## Why I created this theme? First of all, I chose to create my own theme to handle the integrality of the feature and the code. With my previous theme, to still up to date, each time Casper was updated, if I wanted to have the same features I had to update my theme too. In the case of custom features for my own needs, I had to compose with the original theme. Moreover, some people that I know said to me "Hey, I am surprised that you are not using SharePoint for your blog"... Yes, I know ? A long time ago, it was possible to have a public site with SharePoint Online but this feature was removed in favor of a custom site hosted by external providers like GoDaddy (you can see more information about that in [Microsoft Docs](https://docs.microsoft.com/en-us/sharepoint/troubleshoot/sites/public-websites-be-discontinued?ref=blog.lsonline.fr) if you wish ?). Another solution consists to install a SharePoint On-Premise, but the cost to host this kind of solution is quite expensive ? Then, I created this theme ? ## What are the features? Ghost is a very light CMS and it is this point that allows having a performant platform. All additional "features" are mainly provided by the theme. This theme: - Use Microsoft [Fluent UI](https://developer.microsoft.com/fluentui?ref=blog.lsonline.fr) - Provides a similar interface to SharePoint Online - Includes an Apps Launcher Panel - Includes predefined page templates (tags, featured, events) - Includes four templates of post (only based on the page header) - Supports two search engines ([GhostHunter](https://github.com/jamalneufeld/ghostHunter?ref=blog.lsonline.fr) and [Elasticsearch](https://www.elastic.co/?ref=blog.lsonline.fr)) - Supports one comments service ([Isso](https://posativ.org/isso/?ref=blog.lsonline.fr)) - All external links are opened into a new tab automatically > \[note\]**Note** > > All information about the theme configuration are explained into the [Wiki](https://gitlab.lsonline.fr/ghost-themes/ghost-fluent-ui/-/wikis?ref=blog.lsonline.fr) pages of the repository. ## For whom is designed this theme? Mainly for all bloggers who are familiar or experts with the Microsoft environment and who want to share their stories and experiences with everyone. *"Sharing is caring"* Hoping this post will help you ? ### Speaking at MWCP 2021 URL: https://blog.lsonline.fr/2021/01/10/introduction-to-github-first-steps-with-the-sharepoint-solutions-and-github/ Last updated: 2026-01-27T18:55:14.000Z The **Modern Workplace Conference Paris** is one of the biggest technology events in Paris that focus on all Microsoft 365 services proposed by [aMS (previously aOS) Community](https://aos.community/?ref=blog.lsonline.fr). This year's edition will take place from **January18th to 20th** and for the first time Online (due to the current sanitary condition). This is an awesome opportunity for all the people around the world who work on the Microsoft 365 technologies to register at the event. So, don't forget to [register](https://www.eventbrite.fr/e/modern-workplace-conference-paris-2021-online-tickets-129142419453?ref=blog.lsonline.fr) for the event ?. This is the first time that I have the opportunity to speak at the MWCP event and I’ll be presenting "**Introduction to GitHub: First steps with the SharePoint solutions and GitHub**". During this session, we will see together the different components to implement into your SharePoint projects hosted on GitHub to boost the work between the developers and the maintenance of your solutions. For more information about the sessions and the event, check the [official website](https://modern-workplace.pro/?ref=blog.lsonline.fr). --- **[MWCP21 - Introduction GitHub et SharePoint Framework](https://www.slideshare.net/LaurentSittler/mwcp21-introduction-github-et-sharepoint-framework?ref=blog.lsonline.fr "MWCP21 - Introduction GitHub et SharePoint Framework")** from **[Laurent Sittler](https://www.slideshare.net/LaurentSittler?ref=blog.lsonline.fr)** ### Speaking at Microsoft 365 Users Group - January 2021 @Online URL: https://blog.lsonline.fr/2021/01/05/speaking-at-microsoft-365-users-group-january-2021-online/ Last updated: 2026-01-27T18:55:07.000Z On the first Tuesday of each month, the community of the Microsoft 365 Users Group gathers to speak about the latest news around the Microsoft services and hands it over to someone who wishes to share a professional or personal experience around Microsoft 365. For this first meeting of the year 2021, I am honored to introduce you to a sample of a solution to implement an "intelligent" contact form essentially based on Power Platform services without a line of code. Together we will see how to implement this kind of form and because a demonstration is better than a thousand words, I will build the solution with you. I will try to explain to you the reasons for the technical choices, the limitations, the alternatives, etc. This presentation is based on my blog post that you can find [here](https://blog.lsonline.fr/2021/01/03/creating-a-no-code-contact-form-for-your-sharepoint-intranet/). Don’t forget to register with the meetup event [here](https://www.meetup.com/guspquebec/events/273573586/?ref=blog.lsonline.fr). ### Creating a no code Contact Form for your SharePoint Intranet URL: https://blog.lsonline.fr/2021/01/03/creating-a-no-code-contact-form-for-your-sharepoint-intranet/ Last updated: 2026-01-27T18:55:01.000Z Using the Microsoft 365 modern tools means having new methodologies and new approaches to exploit the maximum of the capabilities of these tools. Too often, when users' needs are here, the project owner asks the developers to code a new component without asking if something else can do the job. I have seen a lot of code solutions to create a contact form on SharePoint and now the trend is to use PowerApps to avoid SharePoint Framework Web Part. PowerApps can require "too many" skills for a simple contact form but we agree that the result can be very interesting ? In this post, I will show you another solution based on Microsoft Forms that allows to notify new form answers without email and to manage them as tasks to the IT or the support team behind the scene. ## Create a Teams By creating a team on Microsoft Teams, you are also creating an Office 365 Group. The Teams will act as a central of notifications for the IT or support teams and the Office 365 Group will allow attaching the other Microsoft 365 services that we will see below. The first step, if you do not already have a private Teams dedicated to receiving the notifications and the other configurations below, it is highly recommended that you create a new one from scratch: ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-NoCode-ContactForms-CreateTeams.jpg) Create new Teams for Support During the creating procedure, give a temporary name of the team like `support-intranet`. This name will be used to create the SharePoint site linked to the Teams as well as the email address: - SharePoint site URL: *https://contoso.sharepoint.com/\[sites|teams\]/support-intranet* - Email address: *support-intranet@contoso.com* ### Channels The final goal will be to notify the team every time a new answer was sent. To improve the communication, it is possible to create some channel by thematic. In our example, two channels were created: - **Dev**: to notify all feedbacks about the bugs, features, etc. - **Support**: to notify all support requests like accompanying and other things Once created, you can rename your Teams, add the members and additional owners, change the logo, etc. You are now ready for the next steps. ## Create a new Forms By default, when a user creates a Form, this one is linked to his account but it is also possible to create a Form for an Office 365 Group. ### Create a Group Form To create a Forms linked to an Office 365 Group, find and select the target Office 365 Group from Microsoft Forms: ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-NoCode-ContactForms-ListGroupsForms.jpg) Select an Office 365 Group from Microsoft Forms Then, click on **New Group Form**: ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-NoCode-ContactForms-CreateNewGrpForms-1.jpg) Create a new Microsoft Group Form ### Configure the First Section The first section will act as a router in accordance with the choice of the user: 1. Add a form title and optionally a description 2. Add a choice action named "**Tell us more, why do you want to contact us**" and add options. Note that, the latest option should allow the user to detail a custom choice that does not exist: - If you click on Add "Other" option, the user can type directly a custom option - If you choose another name "Something else...", we can redirect the user to another part of the form that allows the user to specify the subject and details (that is the scenario chosen here) 3. Ensure that the chosen action is **required** 4. **Multiple answers must be disabled** ![](https://blog.lsonline.fr/content/images/2021/01/LsOnline-ContactForm-FirstSection-2.jpg) Example of the first section of Contact Form ### Create Form Sections Once the first section is created, you can create as many sections as the number of available options by performing the following steps: 1. Click on **Add new** 2. Click on the down **arrow** 3. Click on **Section** ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-ContactForm-NewSection.jpg) Create a new Section on a Microsoft Form ### Create a Bug Section Compared to the other sections, the bug one should have a File Upload field to allow sharing the screenshots to help the support to reproduce the bug and fix it. ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-ContactForm-AddFileUpload.jpg) Add File Upload field into Microsoft Form When this kind of field is used for a personal form, the attachments are uploaded into OneDrive in a specific folder `Apps > Microsoft Forms > File Upload > Question`. - `Question` matches with the File Upload question - If you add another File Upload field, the folder will be named `Question1`, etc. Even if you rename the File Upload field, the target folder keeps the same name. When you use a File Upload field with a Form Group, all files will be uploaded into the default Documents library (Shared Documents) and in the `Apps > Microsoft Forms > File Upload > Question` subfolder. ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-ContactForm-FileUploadInfo.jpg) Information message when you create an Upload Files field It is possible to configure the behavior of the "Upload File" field by: - Adding a limit of files to upload (3 files is not bad) - Specifying the limit of size per file - Specifying the expected file type (by extension). If not specified, all types of files are allowed - This field should not be required > \[info\]**Important** > > Once this kind of field is used into a form, only the people in your organization can respond to the form ### Add Branches The branches will allow redirecting the user to another section of the form in accordance with the scenarios such as those illustrated in this example: ![](https://blog.lsonline.fr/content/images/2021/01/LsOnline-ContactForm-BranchOptions.jpg) Set up Microsoft Forms options branches 1. I need help to manage the content -> Section "I need help to manage the content" -> End of the form 2. I found a bug -> Section "Did you find a bug? Tell us more about this bug" -> End of the form 3. I need a new feature -> Section "Do you need a new feature? Give us more details about what you expect about this feature" -> End of the form 4. Something else... -> Section "Something else..." -> End of the form To manage the branches, you must click on the *ellipsis* visible at the top-right corner of each section, then click on **Add branching** ![](https://blog.lsonline.fr/content/images/2020/11/LsOnline-ContactForm-ActiveBranching.jpg) Enable Branching in Microsoft Forms > \[info\]**Important** > > Each section must be configured to go to **End of the form** ### Contact Form Overview ![](https://blog.lsonline.fr/content/images/2021/01/LsOnline-ContactForm-BranchesViewForm.jpg) Microsoft Forms branching options overview > \[info\]**Important** > > Do not create a field more than once with the same name*. If you have several times the same field name, that will be harder to determine which field is which one.* ## Planner To create a Planner combined to a Unified Group / our Teams (Office 365 Group), go to a channel of your Teams and click on the Planner icon: ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-NoCode-ContactForms-CreatePannerFromTeqms.jpg) Create Planner from Teams Channel ### Buckets Once your Planner is ready, create four or more buckets that will allow organizing the answers in accordance with the selected subject at the first section of our Contact form: - Support - Feature - Bug - Other ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-ContactForm-PlannerBuckets.jpg) A Planner with Buckets overview ## Create a Team Flow In accordance with the **Contact form** answers, all the logic lies in Power Automate. The flow will allow the creation of the notifications into the Teams channel and create the Planner tasks. _This post is for subscribers only._ ### Scroll to Top SPFx extension v1.1.0 URL: https://blog.lsonline.fr/2020/12/05/scroll-to-top-spfx-extension-v1-1-0/ Last updated: 2026-01-27T18:54:59.000Z A new version of the SharePoint Framework Scroll to Top extension was released to scroll to the top of the content pages including lists/libraries and any modern page of SharePoint ## New version of Scroll to Top - v1.1.0 This release includes a feature to specify a custom image rather than using Fluent UI icons as well as some other improvements. ### Image URL as Icon ![](https://blog.lsonline.fr/content/images/2020/11/Screen-Shot-2020-10-31-at-20.58.28.png) Scroll To Top button with a custom image If the panoply of UI Fluent Icons is not sufficient for you, you can now specify the URL of your own image/icon into the property of the extension. To use it, simply add the property `buttonImage` and specify the image URL accessible for all of your users. > \[note\]**Note** > > If you use both `buttonImage` and `buttonIcon`, `buttonImage` has priority ### Code Coverage I will try to include more tests for each new version in order to reach 100%. In addition, the code coverage helped me find solutions for some potential issues and improvements. ### Other - Code refactoring and optimization - Add some CI verification during an MR [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Scroll to Top Extension repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/scrollToTop?ref=blog.lsonline.fr) Hoping this post will help you ? ### SharePoint Modern Calendar view for events URL: https://blog.lsonline.fr/2020/12/05/sharepoint-modern-calendar-view-for-events/ Last updated: 2026-01-27T18:54:57.000Z Recently, Microsoft released a feature that allows creating a Calendar modern view. Any list and library can use this view to display the content as a calendar view. > [#SharePoint](https://twitter.com/hashtag/SharePoint?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) calendar view for list item is now available on Targeted environments at least ??? A lot of people will be happy ! Thx Santa Claus ? [#Microsoft365](https://twitter.com/hashtag/Microsoft365?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) [#Office365](https://twitter.com/hashtag/Office365?src=hash&ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) [pic.twitter.com/LYaKNgvCn8](https://t.co/LYaKNgvCn8?ref=blog.lsonline.fr) > > β€” Laurent Sittler (@laul0\_68) [December 1, 2020](https://twitter.com/laul0%5F68/status/1333839458500825090?ref%5Fsrc=twsrc%5Etfw&ref=blog.lsonline.fr) The SharePoint events list still exist on the modern sites but do not have this modern view by default. ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-ClassicOne.jpg) SharePoint Classic Calendar view In this post, we will see how to create a modern calendar view by default for your SharePoint events list. ## Force New Experience of the List Views To allow to create a new modern view, it is necessary to force the new experience of the list view; because even if you change the classic calendar view by "All items" the experience is still in classic mode. 1. Go to your **Events List** parameters - From Site contents - List content ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-ListSettingsFromContent.jpg) ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-ListSettingsFromList.jpg) Access to list settings from Site Contents (left) or list content (right) 1. Click on **Advanced Settings** ![](https://blog.lsonline.fr/content/images/2021/01/LsOnline-SP-ModernCalendarView-AdvancedListSettingsLink.jpg) Access to Advanced settings of the SharePoint list 1. At the bottom of the page, select **New experience** 2. Then click **OK** ![](https://blog.lsonline.fr/content/images/2021/01/LsOnline-SP-ModernCalendarView-ForceNewExp.jpg) From the advanced settings, force new SharePoint experience ## Create the New Calendar View 1. Go to your **Events List** 2. From the SharePoint Ruban, select the **Calendar** tab 3. Change the view by the **All Events** You should see the new experience list view ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-ChangeClassicAllItemsView.jpg) Change Events List classic view 1. From the SharePoint *Command Bar*, click on the **All Events** view button 2. Click on **Create new view** ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-CreateNewModerneView-1.jpg) Create a new SharePoint view 1. Define the name of the view like **Modern Calendar** (*calendar* name is already used by the classic view) 2. Click on the **Calendar** button 3. Select **Start Date** and **End Date** 4. Then, click on **Create** ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-ConfigureNewCalendar-1.jpg) Configure the new Calendar view 1. Define the modern calendar view as default ![](https://blog.lsonline.fr/content/images/2020/12/LsOnline-SP-ModernCalendarView-SetModerneCaldendarViewAsDefault.jpg) Define view as default Hoping this post will help you ? ### The tools for a SharePoint developer - Part 2 URL: https://blog.lsonline.fr/2020/12/03/the-tools-for-a-sharepoint-developer-part-2/ Last updated: 2026-01-27T18:54:50.000Z In my previous post "[The tools for a SharePoint developer - Part 1](https://blog.lsonline.fr/2019/09/10/the-tools-for-a-sharepoint-developer-part-1/)" I mostly wrote about the developer infrastructure and basic tools to execute some scripts to manage your environment. In this post, I will write more about the tools to help the developers with their developments. ## #4 NodeJS If you are developing with modern environments you have to use the newest technologies like the SharePoint Framework. You will find a very good article with all the information about what you have to install and which version you have to use, here: [Set up your SharePoint Framework development environmentUse Visual Studio or your own custom development environment to build SharePoint Framework solutions. You can use a Mac, PC, or Linux.![](https://docs.microsoft.com/favicon.ico)Microsoft Docsspdevdocs![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/set-up-your-development-environment?ref=blog.lsonline.fr) I will not let you just with this information, I will also give you some additional tips that can be useful for your developments: 1. [**pnpm**](https://pnpm.js.org/?ref=blog.lsonline.fr): I chose this one in the first place because I am using it as often as possible and it works very well. If you do not want your SPFx package to take too much space, this solution will allow you to decrease drastically the number of files and the size of your SharePoint solution package 2. [**externalize**](https://pnp.github.io/office365-cli/cmd/spfx/project/project-externalize?ref=blog.lsonline.fr): like *pnpm*, this solution allows you to generate a lighter package than just simply builds it and compresses all files in the same container *.sppkg*; this solution is much lighter than pnpm because all or part of the npm modules are loaded directly from a CDN. You will find a great video from a PnP Community call performed by [Vincent Biret](https://twitter.com/baywet?ref=blog.lsonline.fr) on [Youtube](https://www.youtube.com/watch?v=NL1YO5K%5F5zg&ref=blog.lsonline.fr) 3. [**PnPjs**](https://pnp.github.io/pnpjs/?ref=blog.lsonline.fr): a great Framework that will allow you to save an incredible time of development and avoid you thinking about which SharePoint endpoints you have to use, what kind of requests (GET, POST, PUT) you have to use. PnPjs will make your code clearer (and which should be used in moderation) 4. **[NVM](https://github.com/nvm-sh/nvm?ref=blog.lsonline.fr)**: can be useful if you want to work with the latest version of NodeJs supported with SPFx (v10) for SharePoint Online only and if needed, allows you to switch NodeJs on an SPFx component compatible with SharePoint 2016 or 2019 that support the NodeJs version 8 only (see [NVM for Windows](https://github.com/coreybutler/nvm-windows?ref=blog.lsonline.fr)) 5. **[Fluent UI](https://developer.microsoft.com/en-us/fluentui?ref=blog.lsonline.fr#/)**: to be compliance with the standard UI and with Microsoft 365 interface ## #5 Visual Studio Code ![](https://blog.lsonline.fr/content/images/2020/02/home-screenshot-mac-lg-2x.png) Visual studio code interface If you have to install a code editor, [Visual Studio Code](https://code.visualstudio.com/?ref=blog.lsonline.fr) is the tool you have to install because: - there is a large community of users and developers - it is really light and quick - it supports a lot of languages and solutions - you can manage the conflicts and git actions directly on it - it is cross-platform supported - several shortcuts to make your life easier ## #6 A repository This is certainly the best thing you should use: **a repo**. Even if you are working locally, you can have a local repository based on git that allows you to see all changes, roll back your code based on a version, and maybe save your life ?. If you want to share your code, work in a team, you must use a specific platform to do that. Below, a small list of platforms that can be used in enterprise and I often see them or work with them: 1. [GitHub](https://github.com/?ref=blog.lsonline.fr): the most popular for private, enterprise, or community projects 2. [GitLab](https://about.gitlab.com/?ref=blog.lsonline.fr): maybe the best alternative to GitHub that can be self-hosted too 3. [Azure DevOps](https://azure.microsoft.com/en-us/services/devops/?ref=blog.lsonline.fr): currently, the future of the pure Microsoft Online solution to host your code is uncertain after the acquisition of GitHub but still an awesome platform with the best interface to manage projects, pipelines, backlogs, etc. For more alternatives, I found a good blog post talking about this: [6 Github alternatives that are open source and self-hosted - nixCraftA curated list of six awesome open source Github alternatives that you can host on your own server.![](https://www.cyberciti.biz/cms/wp-content/themes/cybercity/assets/images/icon/android-icon-192x192.png)nixCraftRSS/XML feed![](https://www.cyberciti.biz/media/new/cms/2018/06/Open-Source-GitHub-Alternatives.jpg)](https://www.cyberciti.biz/open-source/github-alternatives-open-source-seflt-hosted/?ref=blog.lsonline.fr) ## #7 Git Clients ![](https://blog.lsonline.fr/content/images/2020/02/fork-git-client-shadow.png) Fork git client interface Before having to pay for access to it, [**Fork**](https://git-fork.com/?ref=blog.lsonline.fr) was my favorite one. Super user-friendly, easy to use, fast, and support GPG commits. If like me, you are looking for a free and cross-platform (Windows and Mac OS at least) Git Client, here are some potential alternatives that I have tested: > \[note\]**Note** > > This list of alternatives excludes the partial freeware softwares (ex: GitKraken that is not free for the enterprises and no open-source projects) 1. **Git command lines**: not easy for a beginner and even for an expert sometimes but totally free and you can access all available functions of a Git repository. In addition, if you are familiar with Git commands, you can take a look at [GitHub CLI](https://cli.github.com/?ref=blog.lsonline.fr) that is extremely powerful and can save you a lot of time 2. [**GitHub Desktop**](https://desktop.github.com/?ref=blog.lsonline.fr): works with several repositories (tried with GitLab and local Git) and supports GPG commits. The UI is simple and sometimes too simple... It is still a good client to manage your projects 3. [**SourceTree**](https://www.sourcetreeapp.com/?ref=blog.lsonline.fr): maybe the greatest alternative to Fork. The interface is user-friendly, easy to use and allows you to access advanced settings of the repository to enable the GPG signing commits and so much more. The only thing is that you have to create an *Atlassian* account to use it 4. **Visual Studio**: all editions of Visual Studio (Code, Community, professional) include a Git client. If you are used to working with it, you can keep it 5. **[GitAhead](https://gitahead.github.io/gitahead.com/?ref=blog.lsonline.fr)**: an open-source solution that allows you to manage several identities and repositories at the same time. It contains a lot of small bugs but it is a young app. I am keeping an eye on it because, in the future, this solution might be very interesting Here, a list of GUI Clients for a larger overview: [Git - GUI Clients![](https://git-scm.com/favicon.ico)GUI Clients![](https://git-scm.com/images/guis/sourcetree@2x.png)](https://git-scm.com/downloads/guis/?ref=blog.lsonline.fr) ## #8 ResX Resource Manager Standalone ![](https://blog.lsonline.fr/content/images/2020/02/StandaloneMainScreen.png) ResX resource Manager application standalone I was using the extension of Visual Studio on this project when I was developing WSP projects for SharePoint On-Premise and now I am still using it as Standalone with VSCode. This tool is extremely useful when you want to manage ResX files; the ResX files are still used when you work with PnP Provisioning. Only one con: it works only with Windows OS ? [tom-englert/ResXResourceManagerManage localization of all ResX-Based resources in one central place. - tom-englert/ResXResourceManager![](https://github.githubassets.com/favicon.ico)GitHubtom-englert![](https://avatars3.githubusercontent.com/u/10229954?s=400&v=4)](https://github.com/tom-englert/ResXResourceManager?ref=blog.lsonline.fr) ## #9 SharePoint Designer 2013 Even if SharePoint Designer is deprecated, it is still a great tool to manage and access some "hidden" features. [Download SharePoint Designer 2013 from Official Microsoft Download Center![](https://www.microsoft.com/global/ImageStore/PublishingImages/logos/144x144/microsoft_symbol_clr_144x144.png)Microsoft Downloads![](https://c.s-microsoft.com/en-us/CMSImages/microsoft_logo_56x56.png?version=ad0d2fa7-0ee8-4e82-ddbf-8ea5dc9d9c23)](https://www.microsoft.com/download/details.aspx?id=35491&ref=blog.lsonline.fr) ## #10 SharePoint Client Browser (SPCB) For a developer, this tool turns really useful to browser all SharePoint objects and shows all properties even the hidden ones [bramdejager/spcbThe SharePoint Client Browser (SPCB) uses the CSOM to connect to a remote SharePoint site collection and shows the site structure with related properties and values. - bramdejager/spcb![](https://github.githubassets.com/favicons/favicon.svg)GitHubbramdejager![](https://avatars1.githubusercontent.com/u/13313123?s=400&v=4)](https://github.com/bramdejager/spcb?ref=blog.lsonline.fr) ## #11 CAML Query "helper" For a developer who wants to create some advanced CAML queries, this kind of tool is really helpful, and maybe even necessary - CAML Designer: (my favorite one ?) [https://www.biwug.be/resources](https://www.biwug.be/resources?ref=blog.lsonline.fr) - U2U CAML Query Builder: [https://www.u2u.be/software](https://www.u2u.be/software?ref=blog.lsonline.fr) ## #12 SharePoint Search Query Tool Creating a SharePoint search request can be challenging... this tool will save you a lot of time [pnp/PnP-ToolsScripts and tools for Office 365 and SharePoint - More for IT Pro’s - pnp/PnP-Tools![](https://github.githubassets.com/favicons/favicon.svg)GitHubpnp![](https://repository-images.githubusercontent.com/46741427/ead5a300-6a78-11e9-8747-d9f817ff2405)](https://github.com/pnp/PnP-Tools/tree/master/Solutions/SharePoint.Search.QueryTool?ref=blog.lsonline.fr) ## #13 BareTail Opening a log file while being used and updated by another script or application can make it impossible to read or to update in real-time. This portable tool allows you to open some log files in read-only mode and to view the log in real-time and so much more... you can highlight some lines based on some rules, support encoding, etc. [Bare Metal Software > BareTail - Free tail for Windows![](http://www.baremetalsoft.com/favicon.ico)Free tail for Windows![](http://www.baremetalsoft.com/baremetalsoftcom.gif)](http://www.baremetalsoft.com/baretail/index.php?ref=blog.lsonline.fr) ## #14 Screen capture If you need to take a screenshot of the whole SharePoint page with a lot of content you can take several screenshots and add them one after another or add this extension to your Microsoft Edge or Google Chrome browser [Full Page Screen Capture - Screenshot Chrome ExtensionThe simplest and most reliable Chrome extension for taking a screenshot of an entire webpage. In one click screenshot a full page. Optionally crop, edit, and annotate your result in a modern interface. Export to image, PDF, or copy to your clipboard so you can share it with others or keep it in your…![](https://gofullpage.com/apple-touch-icon.dfa4900d.png)Screenshot Chrome Extension](https://gofullpage.com/?ref=blog.lsonline.fr) ## #15 Cmder | Console Emulator If you do not like the *Microsoft PowerShell console* or the Visual Studio Code terminal or if you are more familiar with the Unix console, this tool can help you. In addition, I recommend it because it is case sensitive and it can be useful to avoid some build errors due to the case of files (true story ^^) [Cmder | Console Emulatorcmder is software package that provides great console experience even on WindowsConsole Emulator![](https://cmder.net/img/logo.svg)](https://cmder.net/?ref=blog.lsonline.fr) ## #16 A table of HTML special char When you have to display special chars, it is not recommended to write them as is into the code and because it is not easy to remember all correspondences, find here a table of special chars [https://dev.w3.org/html5/html-author/charref](https://dev.w3.org/html5/html-author/charref?ref=blog.lsonline.fr) ## #17 Page Diagnostics tools for SharePoint Online The user experience is one of the keys for the adoption and satisfaction, this is why a SharePoint page that contains OOB components and custom ones should not be too slow and all content should be close to the Microsoft recommendations. This tool is great to provide a report of your pages Only one con: it works only with SharePoint Online [Use the Page Diagnostics tool for SharePoint OnlineUse the Page Diagnostics for SharePoint tool to analyze SharePoint Online modern portal and classic publishing pages against a pre-defined set of performance criteria.![](https://docs.microsoft.com/favicon.ico)Microsoft Docskelleyvice-msft![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-ca/office365/enterprise/page-diagnostics-for-spo?redirectSourcePath=%252fen-us%252farticle%252fdbab2593-dc6a-40f7-adfe-031b9baa620f&ref=blog.lsonline.fr) ## #18 Docker When you are developing a component, you have to install some npm packages globally or locally; when you change the environment (other laptops, other OS, pipelines) you can be confronted with some issues: - Case sensitivity of file names (Windows and Mac OS are not case sensitive) - Missing dependency(ies) - Environment version - etc. A tip to avoid some issues is to try to build the solution on another platform. Docker lends itself well to this exercise; use a NodeJS container mapped with the folder of your solution and build the solution from the container directly [Docker Desktop overviewDocker Desktop overview![](https://docs.docker.com/favicons/docs@2x.ico)Docker Documentation![](https://docs.docker.com/favicons/docs@2x.ico)](https://docs.docker.com/desktop/?ref=blog.lsonline.fr) --- Here some other tools that have nothing to do with SharePoint but can be really useful: ## \# Password Manager Passwords are critical for professional and personal usage. Using the same password or a password based on personal information (birthday, parents' name, family name, known location, etc.) is really risky. In addition to store passwords, this kind of tool can generate random string passwords and so much more 1. **[KeePassXC](https://keepassxc.org/?ref=blog.lsonline.fr)**: the latest version provides a very cool UI, in addition to a lot of features like Auto-Type that works very well. The information is stored into an encrypted flat file stored into the local machine; no server and no synchro with teammate (more for personal usage) 2. **[Bitwarden](https://bitwarden.com/?ref=blog.lsonline.fr)**: my new favorite tool ? compatible with iOS, Android, Windows, Mac, and several browsers (extension). Totally free when the server is self-hosted; very competitive if you choose the cloud solution. It is open-source and supports CLI 3. [**Azure Key Vault**](https://azure.microsoft.com/en-us/services/key-vault/?ref=blog.lsonline.fr): the best tool for your scripts or applications hosted on your Azure environment 4. **[1Password](https://1password.com/?ref=blog.lsonline.fr)**: the only cons are the following ones: this tool can not be self-hosted and the pricing plan is not really competitive; despite these points, this tool is robust, performant, and cross-platform I choose to list these tools based on several criteria: - Support TOTP (except Key Vault) - I am using it for personal or professional usage - Security - Useful features ## \# AD Explorer This tool can be useful in enterprise to check the user profiles in your Active Directory and to check if the information is the same on the SharePoint profiles for example [AD Explorer - Windows SysinternalsActive Directory Explorer is an advanced Active Directory (AD) viewer and editor.Microsoft Docsmarkruss![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer?ref=blog.lsonline.fr) ## \# Puran File Recovery After having deleted a folder that contained some files (that should not be here) and emptied all my OneDrive trashes, I realized after a couple of minutes that I had deleted too many files (this kind of thing can happen to everyone ?)… I spent part of my evening trying to restore the data, found a tool to recover them, and before giving up, I found this free tool that allowed me to recover all files?? [Puran File Recovery - Recovery deleted files for free![](http://www.puransoftware.com/logo.gif)](http://www.puransoftware.com/File-Recovery.html?ref=blog.lsonline.fr) ## \# DiffMerge ![](https://blog.lsonline.fr/content/images/2021/03/filecmp.png) This kind of tool can save you a lot of time when you must merge folders with several files. How that can happen? In my case, I forget sometimes that I already created a folder this some files and I create a new one until I find again the old one ? Ouch! Do not panic, it is existing some tools that can help you to identify the changes and merge the files to finally have one folder up-to-date: - [WinMerge](https://winmerge.org/?ref=blog.lsonline.fr): maybe the most known tool for Windows - [DiffMerge](http://www.sourcegear.com/diffmerge/downloads.php?ref=blog.lsonline.fr): a cross-platform alternative of WinMerge - FileMerge: for MAC OS included in XCode --- Every time I will find a new tool, I will update this page to share it with you ? Hoping this post will help you ? ### SPFx Table Of Contents Extension v1.0.0 URL: https://blog.lsonline.fr/2020/11/26/spfx-table-of-contents-extension-v1-0-0/ Last updated: 2026-01-27T18:54:42.000Z A new version of the SharePoint Framework Table of Contents extension was released to display all headers of a page into a site page. ## New version of Table of Contents - v1.0.0 This release includes a fix for the bug about the icon that is not visible and a feature to specify a custom image rather than using Fluent UI icons as well as some other improvements. ### Fix Icon display Some users can not see the UI Fluent icon even if this one was correctly configured. To fix this issue, the Icon React element is used rather than the CSS class only. Thanks to this method, the selected icon is embedded and can be displayed. ### Image Icon ![](https://blog.lsonline.fr/content/images/2020/10/Screen-Shot-2020-10-21-at-22.41.58.png) Table of Contents button with a custom image If the panoply of UI Fluent Icons is not sufficient for you, you can now specify the URL of your own image/icon into the property of the extension. To use it, simply add the property `tocImage` and specify the image URL accessible for all of your users. > \[note\]**Note** > I*f you use both `tocImage` and `tocIcon`, tocImage has priority* ### Code Coverage It was a challenge and an opportunity to include this kind of test into this solution. I will try to include more tests for each new version to reach 100%. In addition, the code coverage helped me to find solutions for some potential issues that already exist and maybe others not already referenced. ### Other - Upgrade the solution to [SPFx 1.11.0](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/release-1.11.0?ref=blog.lsonline.fr) - Add french support language - Add some CI verification during an MR [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Table of Contents Extension repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/toc?ref=blog.lsonline.fr) Hoping this post will help you ? ### M365 Developer Bootcamp 2020 @MontrΓ©al URL: https://blog.lsonline.fr/2020/11/02/m365-developer-bootcamp-2020-montreal/ Last updated: 2026-01-27T18:54:41.000Z The Global Microsoft 365 Developer Bootcamp is a free, one-day training event led by Microsoft MVPs with support from Microsoft and local community leaders. This year, the Montreal Global Microsoft 365 Developer Bootcamp will provide you a solid introduction to Microsoft Graph, Microsoft Graph Toolkit Framework, and some tips and tricks to help you in your Office 365 developments. This year, I am honored to share with you the *Tips and Tricks* part that will bring you all fundamentals to help you, developers and architects, in your SharePoint developments. My presentation will be a sort of summary of all of my most recent experiences and blog posts. Global Microsoft 365 Developer Bootcamp at MontrΓ©al will take place on November 19, 2021. We hope to see you many ? ### Favicon SPFx extension for SharePoint URL: https://blog.lsonline.fr/2020/10/31/favicon-spfx-extension-for-sharepoint/ Last updated: 2026-01-27T18:54:38.000Z A new SharePoint Framework extension favicon was released to change the default SharePoint favicon by a custom one based on a specific URL or based on the SharePoint site logo. ## Favicon The visual identity of the enterprises is a real need and can contribute to the adoption of the tools. A part of the visual identity is the favicon visible on the tabs of your favorite browser even for your SharePoint projects. ![](https://blog.lsonline.fr/content/images/2020/10/LsOnline-SPFx-Favicon-After.jpg) Microsoft Edge with several SharePoint sites opened ### How it works Like any SharePoint Framework extension, it is possible to: - deploy it for all sites in your Tenant with the same configuration - deploy it in your Tenant and install it per site with a custom configuration - deploy and install it per site collection with the same or a different configuration > \[note\]**Note** > > For more information about how to install a SharePoint Framework component, you can read [this post](https://blog.lsonline.fr/2020/02/19/how-to-install-your-spfx-solution-to-sharepoint/) Once deployed and installed, you can choose one of the below configurations: 1. By default, use the SharePoint site logo as a favicon and if no logo is defined, keep the default SharePoint favicon 2. Use the SharePoint site logo and if no logo is defined to the site, use a custom favicon via the specified URL 3. Use a custom favicon whether the SharePoint site has a logo or not ### Other - Configure CI verification during an MR - Use [pnpm](https://pnpm.js.org/?ref=blog.lsonline.fr) to manage the NodeJS packages - Use [Jest](https://jestjs.io/?ref=blog.lsonline.fr) for code coverage [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Favicon Extension repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/favicon?ref=blog.lsonline.fr) Hoping this post will help you ? ### Group People WebPart v1.1.0 URL: https://blog.lsonline.fr/2020/09/24/group-people-webpart/ Last updated: 2026-01-27T18:54:35.000Z A new version of the ~~Group People~~ SharePoint Group People Web Part was released to display users (only) who are members of a specific SharePoint group. ## New version of Group People - v1.1.0 This release includes a lot of new little features to improve the experience and answer a couple of visual needs besides the code improvements. ![](https://blog.lsonline.fr/content/images/2020/09/LsOnline-SPFx-GroupPeople.gif) ### Update the Web Part name ![](https://blog.lsonline.fr/content/images/2020/09/LsOnline-SPGroupPeopleWP-NewName.jpg) SharePoint Web Part picker Anticipating the next version (2.x) based on Microsoft Graph to retrieve more information and include Office 365 groups and AD Security groups, the stable version 1.x was renamed **SharePoint Group People** rather than *Group People*. ### Manage displayed fields ![](https://blog.lsonline.fr/content/images/2020/09/LsOnline-SPGroupPeopleWP-mngFields-1.jpg) Web Part properties panel - Manage displayed user information For more flexibility and to answer more use cases, the displayed fields can be managed directly from the properties panel of the Web Part. In addition, the number of displayed fields can be extended to three in accordance with the selected size of the pictures. ### Manage the size of the personas' pictures ![](https://blog.lsonline.fr/content/images/2020/09/LsOnline-SPGroupPeopleWP-PictureSizesDD.jpg) Web Part properties panel - Manage pictures size Display user's picture from the SharePoint user profiles allows to automatically sync the user's properties with the Web Part. The UI Fluent [Persona control](https://developer.microsoft.com/en-us/fluentui?ref=blog.lsonline.fr#/controls/web/persona#implementation) has several properties and among them the size property that enables to change of the size of the user's pictures. Rather than listing all available sizes, three of them that seem to be the most relevant ones have been selected: - Regular - Large - ExtraLarge ### Hide Web Part if nothing to show ![](https://blog.lsonline.fr/content/images/2020/09/LsOnline-SPGroupPeopleWP-HideWPCheckBox.jpg) Web Part properties panel - Manage visibility if nothing to show When a Web Part does not contain content, it is possible to display: - The title of the Web Part only - A shimmer or a default content - A default message in addition to the title to explain to the user that nothing was found - Or even hide the Web Part completely With the new version, a default message is displayed if nothing is to show and let the possibility to choose to hide the Web Part completely from the properties panel. ### Code coverage The code coverage is not easy (I think) with the SPFx components; there is not a lot of "official" documentation about it and the existing one is quite deprecated. It was a challenge and an opportunity to include this kind of test into this solution. 100% of the code is covered (excluding the WebPart.ts file). Moreover, the code coverage was really useful for this solution to check each part of the code and with a good mock, it is possible to find some issues before releasing a new version. > \[success\] ✍? I think I will write one or more blog posts about the code coverage, the mocks and the steps to include it into your own solution (don't hesitate to let me know if this kind of subject interests you ?). ### Other - Upgrade the solution to [SPFx 1.11.0](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/release-1.11.0?ref=blog.lsonline.fr). - The code was totally restructured to improve the maintainability, be compliance with the Best Practices of developments and facilitate the [Jest](https://jestjs.io/?ref=blog.lsonline.fr) unit tests - As part of the unit tests, the PnPJS Framework was removed from the solution. Some other useless packages were removed from the solution to reduce the size of the package - The new release (from the repository) uses [pnpm](https://pnpm.js.org/?ref=blog.lsonline.fr) to manage the NodeJS packages. The previous version size was 136 KB and the new one is 105KB. This is really huge for a little solution like this one - Also with the aim of having a better performance, limiting the bandwidth, and avoiding threshold, a cache system was implemented for the SharePoint requests that are the most used. The cache was set up to 5 minutes - Some CSS bugs were fixed, including the people cards alignment - Add french support language --- ## More information Another version is in pending to add more capabilities and include Microsoft Graph. Some people have contributed to the next version that will be released as soon as possible (thank you guys ??). You are maybe wondering: "Why keeping a version without Microsoft Graph?" - Firstly because without Microsoft Graph, no authorization from SharePoint admin is required - Secondly, the first goal of this Web Part was to display some people without editing the page every time when you used the [People Web Part](https://support.microsoft.com/office/show-people-profiles-on-your-page-with-the-people-web-part-7e52c5f6-2d72-48fa-a9d3-d2750765fa05?ref=blog.lsonline.fr) [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) SharePoint Group People Web Part repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/group-people?ref=blog.lsonline.fr) Hoping this post will help you ? ### Scroll back to top SPFx extension v1.0.0 URL: https://blog.lsonline.fr/2020/09/09/scroll-back-to-top-spfx-extension-v1-0-0/ Last updated: 2026-01-27T18:54:26.000Z A new version of the Scroll Back to Top extension was released to display a button that can allow all the users to scroll back to the top of the page, the site content, a list view, or a library view. ## New version of Scroll back to top - v1.0.0 Due to some reported issues with the icon visibility and to the latest updates made by Microsoft, a news release was necessary to keep this extension usable. ### Fix scroll to the top from pages A few weeks ago, the generated SharePoint HTML has changed. The CSS class used to scroll to the top of a page (Site Pages) does not exist anymore. A new HTML attribute is used now. This one should be more durable. ### Use REACT render rather than JavaScript In the previous version, the button was generated directly via JavaScript, now a React render is used to do this. Rather than using an event listener to catch the user's click, a handler is used. Thanks to this method, we ensure that only one event listener is created (partial load page could cause some duplicates) and that the script is executed on demand. ### Other - Code refactoring and optimization - Initialize Unit Tests - Upgrade to SPFx 1.11 ## More information You can find more details in the repo: [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) SharePoint - Scroll To the Top ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/scrollToTop/-/releases?ref=blog.lsonline.fr) Hoping this post will help you ? ### How to request and expose your Elasticsearch engine for your Ghost blog URL: https://blog.lsonline.fr/2020/07/17/how-to-request-and-expose-your-elasticsearch-engine-for-your-ghost-blog/ Last updated: 2026-01-27T18:54:19.000Z I recently wrote a post about implement Elasticsearch to allow your readers to search in the contents of your self-hosted Ghost blog "**[Elasticsearch as search engine for your Ghost blog](https://blog.lsonline.fr/2020/07/08/elasticsearch-as-search-engine-for-your-ghost-blog/)**". In this post, I will explain to you how to expose and use your search engine. ## Expose your search endpoint with a reverse proxy Based on my previous post, the Elasticsearch endpoint has its own URL. That means, if you want to use it in a production environment, all requests must be against another public URL. Example: - The URL of your Ghost blog is: `https://blog.mydomain.com/` - The URL of your Elasticsearch server is: `https://elasticsearch.mydomain.com:9200/blog_search/post/_search` ![](https://blog.lsonline.fr/content/images/2020/07/LsOnline-elk-noproxylocation-404.jpg) ![](https://blog.lsonline.fr/content/images/2020/07/LsOnline-elk-noproxylocation-auth.jpg) Network access without reverse-proxy restriction Some [CORS](https://en.wikipedia.org/wiki/Cross-origin%5Fresource%5Fsharing?ref=blog.lsonline.fr) security conflicts with the browsers may occur if you have another subdomain. Moreover, with a public Elasticsearch endpoint, it is possible to request all indexes of your search service. In this case, we only have `/blog_search/` and if you want to use your engine with other services, that can be considered as a security leak. Example: - If you use the URL *https://elasticsearch.mydomain.com:9200/\_search*: you can access any index of your search - If you use the URL *https://elasticsearch.mydomain.com:9200/blog\_search/\_search*: you can only access the index *blog\_search* ![](https://blog.lsonline.fr/content/images/2020/07/LsOnline-elasticsearch-proxyconfig-location.jpg) ![](https://blog.lsonline.fr/content/images/2020/07/LsOnline-elasticsearch-proxyconfig-noexternal.jpg) Network access with reverse-proxy location Expose your Elasticsearch through a reverse proxy can help you to: - Force the access to a specific index - Redirect search queries from your blog URL to your Elasticsearch server - Not directly expose your search endpoint on the internet ### Docker Nginx Proxy Thanks to the [**jwilder/nginx-proxy**](https://github.com/nginx-proxy/nginx-proxy?ref=blog.lsonline.fr) docker image, it is possible to host several docker containers on one physical server and to customize the configuration of the external access for all or per container. #### Prerequisites - A Docker [internal network](https://github.com/nginx-proxy/nginx-proxy?ref=blog.lsonline.fr#internet-vs-local-network-access) that allows connecting all containers with no external access (recommended). Example: ```bash docker network create --driver=bridge --attachable --scope=local --internal --subnet=10.1.0.0/24 no-internet ``` - A Docker network that allows access from the Internet (that can be the default one) - A folder named `vhost` that will be mapped with the `nginx-proxy` container and that will contain custom [location configurations](https://github.com/nginx-proxy/nginx-proxy?ref=blog.lsonline.fr#per-virtual%5Fhost-location-configuration) *(use a folder to store all configuration files is more flexible and maintainable than binding each configuration file)* #### Docker file With these prerequisites in mind, here is the **nginx-proxy** compose file: ```docker version: '3.7' services: ghost-nginx-proxy: image: jwilder/nginx-proxy ports: - "80:80" - "443:443" volumes: - "/var/run/docker.sock:/tmp/docker.sock:ro" - type: bind source: ./vhost target: /etc/nginx/vhost.d networks: - no-internet - default restart: always networks: default: no-internet: external: name: no-internet ``` Docker compose file for Nginx > \[info\]**Important** > > *It is important to note that the nginx container must have access to the default (internet) network and the local one (no-internet) too.* You can start the container: ```bash docker-compose -f nginx-proxy-compose.yml up -d ``` ### Virtual Host Location It is time to create your location file `myblog.mydomain.com_location` that allows to redirect all requests to your Elasticsearch server: ```ini # Search API delivered by ElasticSearch location ^~ /api/search { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Connection "Keep-Alive"; proxy_set_header Proxy-Connection "Keep-Alive"; proxy_pass http://ghost-elasticsearch:9200/blog_search/post/_search; proxy_read_timeout 600; } ``` Nginx custom location file - The file name must be named like your **Ghost blog URL** (same as the value of your VIRTUAL\_HOST docker environment variable used by your Ghost blog container) and saved into your `vhost` folder - In this case, the endpoint will be **/api/search**. That means if your blog URL is `https://myblog.mydomain.com`, your Elasticsearch endpoint will be `https://myblog.mydomain.com/api/search` - The last important thing is the `proxy_pass` that redirects all requests to your Elasticsearch and more particularly to the index of your blog search ? #### Update your Elastic stack file Based on my post [*Elasticsearch as search engine for your Ghost blog*](https://blog.lsonline.fr/2020/07/08/elasticsearch-as-search-engine-for-your-ghost-blog/), I shared the docker-compose file for Elasticsearch with you. You must change the file to restrict the external network and specify the local network only: ```docker version: '3.7' services: ghost-elasticsearch: ... networks: - no-internet ... ghost-logstash: ... networks: - no-internet ... networks: no-internet: external: name: no-internet ``` Limit access to the local network only for Elasticsearch Once the changes made, `down` and `up` your Elasticsearch container. Ensure the following connexions between the servers: - Elasticsearch <-> Logstash - Logstash <-> Ghost blog database - Ghost blog <-> Ghost blog database - Nginx <-> Ghost blog - Nginx <-> Elastisearch Maybe a little schema to be clearer? Ok, here the new HTTP feed redirection: ![](https://blog.lsonline.fr/content/images/2020/07/ghost-elasticsearch-schema-1.png) You are now ready to request your Elasticsearch on safe use ? ## JavaScript code implementation At this point, I am pretty sure you can not wait anymore to test your configuration and know how you can launch requests via JavaScript on your new search engine ? Without further ado, the part of JavaScript to launch the requests against your search is: ```javascript function sendQuerySearch(keyword) { /* Because we are using the same hostname, we can use relative URL */ var t = '/api/search'; var s = typeof XMLHttpRequest != 'undefined' ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); /* Open an async POST request */ s.open('POST', t, true); s.setRequestHeader("Accept", "application/json;odata=verbose"); s.setRequestHeader("Content-Type", "application/json"); /* If you enabled the authentication on your Elastic search enable credentials */ s.withCredentials = true; /* Use basic authentication * elasticsearch_auth match with btoa("elastic:yourpassword"); */ s.setRequestHeader("Authorization", "Basic " + elasticsearch_auth); s.onreadystatechange = function () { var status; if (s.readyState == 4) { // `DONE` status = s.status; if (status == 200) { /* retrieve the request answer */ var data = JSON.parse(s.responseText); } else { /* Something is wrong. Add console to see what is happening */ } } }; /* Body request */ var body = { "size": 500, "from": 0, "query": { "query_string": { "query": keyword, "default_operator": "AND" } }, "post_filter": { "term": { "status": "published" } }, "highlight": { "fields": { "title": { }, "custom_excerpt": { } } } }; /* Send the request against Elasticsearch api */ s.send(JSON.stringify(body)); } ``` JavaScript function to request Elasticsearch - **size**: number of results returned by the search engine. It can be increased or you can manage the pagination with the `from` property - **from**: return results of the search from a specific *index* - **query**: - **query**: `keyword` that corresponds to the search performed by the user (the value from the HTML input) - **default\_operator**: the operator between each word of the search - **post\_filter**: filter the posts/pages by their status to return only **published** resources - **highlight**: one of the powerful features of a real search engine is to return the fields with the highlighted words from the content in accordance with the search keywords > \[note\]**Note** > > For more information about the Elasticsearch body request, see the documentation at [https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html?ref=blog.lsonline.fr) You are now ready to perform search requests and get the results from JavaScript. --- ## What's next In the next part, I will share with you how to implement a search interface that looks almost like the Ghost Admin one. Hoping this post will help you ? ### Elasticsearch as search engine for your Ghost blog URL: https://blog.lsonline.fr/2020/07/08/elasticsearch-as-search-engine-for-your-ghost-blog/ Last updated: 2026-01-27T18:54:15.000Z If you have a personal or professional blog based on the Ghost blog CMS, you know how it is speed and user-friendly but unfortunately lacks a search engine. My own blog is currently based on Ghost and I tried a couple of time to find the best solution to implement an efficient and manageable search engine. There are a lot of workarounds to add a search engine and here are three solutions on which I have focused: 1. [**Ghost Hunter**](https://github.com/jamalneufeld/ghostHunter?ref=blog.lsonline.fr): this is the first search engine I implemented into my blog. Very easy to set up, the latest version uses the new Ghost v2 Content API and no additional skill in development is necessary. As you can imagine, this solution is simple and it provides a limited offer on the control on the search experience and results. 2. **[Azure Search](https://azure.microsoft.com/services/search/?ref=blog.lsonline.fr)**: an awesome workaround based on the Microsoft professional platform. If you are used to working with the Microsoft environment, that can be a really good choice. In addition, Azure Search has up to 10 000 free documents ?. I hesitated a long time to use this solution but in my case, I prefer to host as far as possible the services on my own VPS to avoid spreading my data into the Cloud. By the way, [Waldek Mastykarz](https://blog.mastykarz.nl/?ref=blog.lsonline.fr) wrote an awesome post to implement [Azure Search with a hosted Ghost blog](https://blog.mastykarz.nl/azure-search-hosted-ghost-blog/?ref=blog.lsonline.fr). 3. [**Elasticsearch**](https://www.elastic.co/webinars/getting-started-elasticsearch?ref=blog.lsonline.fr): a real professional open-source alternative that I implemented into my blog because Elastic offers several setup ways including Docker. The post *[IntΓ©grez ElasticSearch comme moteur de recherche Γ  votre site Internet](https://www.geeek.org/installer-elasticsearch-logstash-site-internet/?ref=blog.lsonline.fr)* written by [Ludovic Toinel](https://www.geeek.org/author/ltoinel/?ref=blog.lsonline.fr) is really helpful and provides a good approach on how to configure Elasticsearch for Ghost. # Using Elasticsearch with a self-hosted Docker Ghost blog I will not dwell on the Ghost blog docker-compose, I will focus on the Elasticsearch stack and all the configurations. I assume that your Ghost blog and his database are already up. ### Elasticsearch Docker ```docker version: '3.7' services: ghost-elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0 ports: - 9200:9200 environment: - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - ELASTIC_USERNAME=elastic - ELASTIC_PASSWORD=password01 - xpack.license.self_generated.type=trial - xpack.security.enabled=true - discovery.type=single-node volumes: - type: bind source: ./elasticsearch target: /usr/share/elasticsearch/data restart: always ``` Elasticsearch docker-compose - **ports**: the principal port used to request the search is the 9200 one - **environment**: - **xpack.security.enabled**: must be defined as **true** if you want to add basic authentication to access your search engine - **xpack.license.self\_generated.type**: must be **trial** if you want to use the security - **ELASTIC\_USERNAME**: can not be other than **elastic**. This variable is effective only if the security is enabled. It is not mandatory, you can disable the security if you want to - **ELASTIC\_PASSWORD**: if you enable the security, you have to specify the password for the elastic account - **volumes**: specify a local folder to persist the search data Elasticsearch can not connect directly to your Ghost blog database and index the content alone, this is why [Logstash](https://www.elastic.co/logstash?ref=blog.lsonline.fr) is necessary. ### Logstash Docker ```docker ghost-elastic-logstash: image: docker.elastic.co/logstash/logstash:7.8.0 command: logstash -f /usr/share/logstash/pipeline/logstash.conf environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - XPACK_MONITORING_ENABLED=false volumes: - type: bind source: ./mysql-connector-java-5.1.49.jar target: /usr/share/logstash/vendor/mysql/mysql-connector-java-5.1.49.jar - type: bind source: ./logstash.conf target: /usr/share/logstash/pipeline/logstash.conf depends_on: - ghost-elasticsearch restart: always ``` Logstash docker-compose - **command**: load the Logstash config defined into the **logstash.conf** file - **environment**: - JVM options: [https://www.elastic.co/guide/en/elasticsearch/reference/6.8/jvm-options.html](https://www.elastic.co/guide/en/elasticsearch/reference/6.8/jvm-options.html?ref=blog.lsonline.fr) - XPACK\_MONITORING\_ENABLED: set to **false** because we do not need to monitor the Elasticsearch cluster in our case - **volumes**: - The MySQL connector allows Logstash to connect to the Ghost MySQL database. This connector is not included in the docker image, you must download the connector (you can download it directly from the [MySQL Community](https://dev.mysql.com/downloads/connector/j/5.1.html?ref=blog.lsonline.fr)) and bind it with your docker container. - Logstash configuration file allows configuring the input database and the output to Elasticsearch - **depends\_on**: wait until Elasticsearch container is up before launching Logstash ### Logstash configuration Before launching the docker-compose, it is necessary to configure Logstash through the logstash.conf file: ```ini input { jdbc { jdbc_connection_string => "jdbc:mysql://mysql-ghost:3306/ghost" jdbc_user => "blog-user" jdbc_password => "supersecret" jdbc_driver_library => "/usr/share/logstash/vendor/mysql/mysql-connector-java-5.1.49.jar" jdbc_driver_class => "com.mysql.jdbc.Driver" statement => "SELECT id,title,custom_excerpt,slug,featured,feature_image,published_at,updated_at,type,status,visibility, (CASE type WHEN 'post' THEN CONCAT(DATE_FORMAT(published_at, '/%Y/%m/%d/'), slug) ELSE slug END) as 'url' FROM posts WHERE `published_at` IS NOT NULL UNION SELECT resource_id as 'id','' as 'title','' as 'custom_excerpt','' as 'slug',0 as 'featured','' as 'feature_image',NULL as 'published_at',NULL as 'updated_at',resource_type as 'type','deleted' as 'status','' as 'visibility', '' as 'url' FROM actions WHERE `resource_type`='post' AND `event`='deleted'" use_column_value => true tracking_column => "updated_at" tracking_column_type => "timestamp" schedule => "*/5 * * * *" } } output { stdout { codec => json_lines } elasticsearch { hosts => ["http://ghost-elasticsearch:9200"] user => "elastic" password => "password01" index => "blog_search" document_type => "post" document_id => "%{id}" doc_as_upsert => true } } ``` Logstash configuration file - input - jdbc - jdbc\_connection\_string: `"jdbc:mysql://mysql-ghost:3306/ghost"` **mysql-ghost* is the docker service name (dns machine name)* **ghost* is the database name* - jdbc\_user => "blog-user" *MySQL user account that can access the Ghost database* - jdbc\_password => "supersecret" *MySQL user password* - statement => "..." *It is the MySQL query that allows to get your Ghost posts from the database* - use\_column\_value => true - tracking\_column => "updated\_at" - tracking\_column\_type => "timestamp" - schedule => "\*/5 \* \* \* \*" The *Frequency of Logstash must launch the MySQL request. For development needs, I do not want to wait too long to make sure my changes are right. In this case, I scheduled Logstash to update the search every 5 minutes.* > \[success\]Tip > > If you want to create your own **cron** expression, you can use [https://crontab.guru/every-5-minutes](https://crontab.guru/every-5-minutes?ref=blog.lsonline.fr) to help you. - output - elasticsearch - hosts: you can use the docker service name (DNS machine name) - user: only if *xpack.security* is enabled - password: only if *xpack.security* is enabled - index: Elasticsearch index (it will be used for the HTTTP request later) - document\_type: (deprecated) set the doc type (it will be used for the HTTP request later) - doc\_as\_upsert: to allow update mode #### Statement The MySQL query used in the statement of Logstash can look a little complicated but it is not. It combines two queries: ```sql SELECT id, title, custom_excerpt, slug, featured, feature_image, published_at, updated_at, type, status, visibility, (CASE type WHEN 'post' THEN CONCAT(DATE_FORMAT(published_at, '/%Y/%m/%d/'), slug) ELSE slug END) as 'url' FROM posts WHERE `published_at` IS NOT NULL ``` The first part of the Logstash SQL query The first query gets all of the information of all the elements with a **published\_at** date. The most important fields retrieved with this query are: - **id**: unique for each post, this is the ID that allows us to update the indexed posts - **title**: important for the search results - **custom\_excerpt**: useful during the search to match with more keywords than just the title - **published\_at**: the date of the post publishing. The value is NULL if the post was never published - **type**: to know if the element is a page or a post - **status**: draft or published - **visibility**: implemented with the latest versions of Ghost that allow you to create public or private posts - **url**: by default, you can use the slug posts/pages only but if you manage the URLs with a customized [permalink pattern](https://ghost.org/docs/api/v3/handlebars-themes/routing/collections/?ref=blog.lsonline.fr), you have to build the URL of the posts. In my case, I chose the following pattern: `/{year}/{month}/{day}/{slug}/`. I need to use a *SQL CASE* to determine if the current item is a post or a page: - If `type` is equal to **page**, the URL is equal to the slug - If `type` is equal to **post**, the URL will be based on the **published\_at** date formatted `DATE_FORMAT(published_at, '/%Y/%m/%d/')` \+ `slug` - ~~**plaintext**~~: If this field is indexed, it is possible to get the content of your posts from the search without taking the privacy of the post (Members or Paid-members) into account #### Status The status is really important for three use cases: 1. When an element is published, the status is **published** ??? 2. When an element is drafted, the status is **draft**. But, it is possible to unpublish an element then the published date still exists but the status changed to **draft** 3. When an element is deleted, it does not exist anymore in the MySQL table and Logstash can not automatically delete the deleted elements. This is why there is a **UNION** with another SQL query to identify which element was deleted ? ```sql SELECT resource_id as 'id', '' as 'title', '' as 'custom_excerpt', '' as 'slug', 0 as 'featured', '' as 'feature_image', NULL as 'published_at', NULL as 'updated_at', resource_type as 'type', 'deleted' as 'status', '' as 'visibility', '' as 'url' FROM actions WHERE `resource_type`='post' AND `event`='deleted' ``` The second part of the Logstash SQL query The **actions** table is like a log of events for Ghost. You can find when a resource was created, edited, deleted, and the same for the pages. In the case of a UNION SQL query, both queries have to return the same number of columns and to avoid any ambiguity with the column names, I assign in the second query the same names as the first one: - **resource\_id as 'id'**: in the actions table, the id column matches with the id of the action/event and not the post/page. Hopefully, the *resource\_id* column matches with the id of the post/page objects (user id, tag id, api\_key id, etc.) - **resource\_type**: with value as **post** for the posts and the objects of the page (unfortunately, if it was a page, after deleting it, it becomes a post ?. But it is not important because you deleted it ?) - **event**: is the type of event that occurred on a specific object (added, edited or deleted) ## Launch your Elasticsearch stack At this point, your Elasticsearch is ready, your Logstash can access your MySQL database and create an index. It is time to launch the stack: ```bash docker-compose -f elasticsearch-ghost.yml up ``` Launch docker-compose file As you can see, I choose to not add the `-d` option to see the output log directly from the console and ensure everything is ok. After 5 minutes, you should see something like this: ![](https://blog.lsonline.fr/content/images/2020/06/LsOnline-ELK-LogstashIndex.jpg) Logstash is indexing MySQL database If you can see that, that means your Logstash server has to access to your database and is getting the content in accordance with the SQL query. We have to check one more thing... The Elasticsearch endpoint access. To test it, it is quick: - Open your favorite browser - Enter the URL [http://0.0.0.0:9200/blog\_search/post/\_search](http://0.0.0.0:9200/blog%5Fsearch/post/%5Fsearch?ref=blog.lsonline.fr) (change the IP address if you are not testing on your local computer) - blog\_search: is the Elasticsearch index - post: is the doc\_type (deprecated) - \_search: Elasticsearch endpoint ![](https://blog.lsonline.fr/content/images/2020/06/LsOnline-ELK-BrowserAuth.jpg) ![](https://blog.lsonline.fr/content/images/2020/06/LsOnline-ELK-BrowserGetSearch.jpg) Get Elasticsearch results > \[note\]**Note** > > If you choose to enable the security, you will be asked for credentials (user: elastic, password: \[your password\]). > \[note\]**Note** > > By default, Elasticsearch returns 10 results. You are now ready to use it as a search engine ???? --- ## What's next In the next part, I will share with you how to request and expose your Elasticsearch engine for your Ghost blog. [How to request and expose your Elasticsearch engine for your Ghost blogIn this post, I will explain to you how to expose and use your Elastic search engine for your self-hosted Ghost blog with Docker![](https://blog.lsonline.fr/assets/favicon/apple-touch-icon.png?v=d1b7a179c2)LsOnlineLaurent Sittler![](https://blog.lsonline.fr/content/images/2020/06/lsonline_elasticsearch_ghostblog.jpg)](https://blog.lsonline.fr/2020/07/17/how-to-request-and-expose-your-elasticsearch-engine-for-your-ghost-blog/) Hoping this post will help you ? ### Configure dynamic fields on your SharePoint Forms URL: https://blog.lsonline.fr/2020/06/18/configure-dynamic-fields-on-your-sharepoint-forms/ Last updated: 2026-01-27T18:54:04.000Z If you have already wanted to create some dynamic fields into the SharePoint item form in accordance with the selected value from another field, you have often been forced to use Microsoft Power Apps due to this kind of use case... How about if I tell you that for some very simple use cases, it is possible without Power Apps? Almost every week, sometimes during several days, Microsoft rolls out new features for SharePoint Online and other Microsoft 365 services. It is not easy to follow all new features and sometimes the smallest ones can become really useful like the update feature **Conditionally show or hide columns in a SharePoint list or library form**. Until now, when you wanted to configure which column had to be displayed in accordance with a value from another field, the only choice was to use Power Apps. [Customize a SharePoint list form - Power AppsUse Power Apps to customize the form with which users create and update entries in a SharePoint list.Microsoft Docstapanm-MSFT![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/customize-list-form?ref=blog.lsonline.fr) Here an example of a use case: - A **mandatory** column of type *Choice* named **Provider**. The choices are: - Microsoft - PnP Community - A column of type *Choice* named **MSProducts**. List of several Microsoft 365 services - A column of type *Choice* named **PnPProducts**. List of several products provided by the PnP Community - When the **Microsoft** value is selected from the *Provider* column, the *MSProducts* field has to be displayed and the *PnPProducts* hidden - When the **PnP Community** value is selected from the *Provider* column, the *PnPProducts* field has to be displayed and the *MSProducts* hidden ## Steps of configuration 1. Create a new item to the list 2. Once created, open the display panel by clicking on the title (by default) 3. From the header of the panel, expand **Edit form** and click on **Edit columns** ![](https://blog.lsonline.fr/content/images/2020/06/LsOnline-EditConditionalSPForm-1.jpg) 1. From the panel of columns, hover onto the target column (MSProducts) and *click on the ellipsis* 2. Click on **Edit conditional formula** ![](https://blog.lsonline.fr/content/images/2020/06/LsOnline-SP-Edit-CondFormula.jpg) 1. From the dialog, enter the following formula: `=if([$Provider]== 'Microsoft', 'true', 'false')` 2. Click on **Save** ![](https://blog.lsonline.fr/content/images/2020/06/LsOnline-SP-FieldColumn-mscase.jpg) 1. Edit the Conditional Formula of the other column (PnPProducts) 2. Enter the following formula: `=if([$Provider]== 'PnP Community', 'true', 'false')` 3. Click on **Save** 4. Click **Save** from the panel For those who are curious and want to know why we are currently editing the *Display form* rather than the *Edit form*, I do not have any logical explanation ??‍♂️?? Before writing this post, I tried to configure the Edit form but the formulas were not valid... [MC211640: Conditionally show or hide columns in a SharePoint list or library formAfter several attempts to operate a conditional field on item form, the formula still invalid. The use case is the following one: 1 column Provider, type Choice with 2 values 2 other columns msProducts and pnpProducts, type Choice When the provider is equals to Microsoft, the column msProducts shou…![](https://gxcuf89792.i.lithium.com/html/assets/favicon2.ico)TECHCOMMUNITY.MICROSOFT.COMLaurent SITTLER![](https://gxcuf89792.i.lithium.com/t5/image/serverpage/image-id/195825iB1B311659F665AC0?v=1.0)](https://techcommunity.microsoft.com/t5/sharepoint/mc211640-conditionally-show-or-hide-columns-in-a-sharepoint-list/m-p/1431279?ref=blog.lsonline.fr) From now on, if you create a new item, in accordance with the selected value from the Provider field, the *MSProducts* or *PnPProducts* will appear and all without a Power Apps form. How cool is that? ??? ![](https://blog.lsonline.fr/content/images/2020/06/Show-Hide-SP-Field-Form.gif) SharePoint show/hide columns in list form demo > \[note\]**Note** > > If you select a first provider and choose a MSProduct then change the provider and select a PnPProduct, both will be defined when you save the item. --- Reference: [Show or hide columns in a list formCustomize which columns to show or hide using a conditional formula in the list form by constructing a simple formula that are equations performing conditional checks on values in a SharePoint list or library.Microsoft Docsspdevdocs![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-ca/sharepoint/dev/declarative-customization/list-form-conditional-show-hide?ref=blog.lsonline.fr#specify-conditional-formula-to-show-or-hide-columns) > \[note\]**Note** > > All column types are supported except: > \- Person columns with multiple selections > \- Time calculations in DateTime column > \- Currency columns > \- Location columns > \- Calculated columns > \- Managed Metadata columns Hoping this post will help you ? ### A SPFx Table Of Contents Extension for SharePoint URL: https://blog.lsonline.fr/2020/05/13/a-spfx-table-of-contents-extension-for-sharepoint/ Last updated: 2026-01-27T18:53:52.000Z On your SharePoint pages, using a table of contents can be useful to direct the reader to exactly where they need to be, in addition to making your SharePoint pages more reader-friendly. Currently, no Out-The-Box WebPart or feature exists to generate a Table Of Contents based on the content of the page. It was already the case for the legacy pages (classic experience) of SharePoint. That is why I created a little script for the classic experience of SharePoint that you can find in my other post: [Create a dynamic Table of Content for your SharePoint Wiki pagesTo facilitate the users experience and win in productivity, implement a dynamic and reusable TOC will help users to access directly to the targeted chapter![](https://blog.lsonline.fr/assets/favicon/apple-touch-icon.png?v=3453d0e8cf)LsOnlineLaurent Sittler![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-SP-TOC-Post.JPG)](https://blog.lsonline.fr/2018/12/23/create-a-dynamic-table-of-content-for-your-sharepoint-wiki-pages/) Because this little script seems to meet your expectation, I think a Table Of Contents for your SharePoint modern pages can be useful too ? Below is a preview of the SharePoint Framework extension from SharePoint Online: ![](https://blog.lsonline.fr/content/images/2020/05/LsOnline-SPFx-TOC.gif) TOC preview What are the currently supported features: 1. ApplicationCustomizer 2. Can be deployed into the whole Tenant 3. Add a button at the bottom of all pages of the site collection (if at least one header exists on the current page) 4. When clicking on this button, a right panel will open with all clickable headers 5. Change button shape 6. Change button icon 7. Specify supported headers 8. Support headers from H2 to H4 ## How to install this extension If you want to install this extension for all site collections of your Tenant, the easiest way is to deploy it into your Tenant App Catalog directly. You can just add the extension with a *drag & drop* of the [package](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/toc/-/releases?ref=blog.lsonline.fr) `.sppkg` into the **Apps for SharePoint** library or by clicking on **Upload**. Once done, a modal will appear to deploy the package. If you want to deploy and enable the extension for all sites collections in your Tenant, check the case *"Make this solution available to all sites in the organization"* and click **Deploy** ![](https://blog.lsonline.fr/content/images/2020/05/LsOnline-DeployToc-diaog.jpg) SharePoint modal to deploy package from App Catalog Once deployed for all sites, you can go on whatever sites collection with a page with at least one header and you should see something like this: ![](https://blog.lsonline.fr/content/images/2020/05/Screen-Shot-2020-05-10-at-19.10.46.png) Default TOC button If the default configuration is not what you want, you can change: - The shape (`square` or `circle`) - The UI Fabric icon - The supported headers (between H2 and H4) > \[note\]**Note** > > The button uses the primary color of the site theme If you wish to edit the configuration, you have to go to the "Tenant Wide Extensions" list located in your Tenant Apps Catalog (only available on the Tenant Apps Catalog) ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-ScrollToTop-AppsCatalogSiteContent.jpg) SharePoint Tenant Wide Extensions list located into the Tenant Apps Catalog Find the item with the `Component Id` that equals `ec4bf35f-7f65-49e7-8b28-c9a59d2d712a`: ![](https://blog.lsonline.fr/content/images/2020/05/LsOnline-TEnantWideExtension-TocConfig.jpg) SharePoint Tenant Wide Extensions list items Edit the `Component Properties` of the item like this (for example): ```JSON {"tocIcon":"AnchorLock","tocShape":"circle","tocHeaders":""} ``` Example of custom configuration Save the item and go on whatever sites collection and you should see something like this: ![](https://blog.lsonline.fr/content/images/2020/05/Screen-Shot-2020-05-10-at-19.09.25.png) Custom TOC button [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Table Of Contents repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/toc?ref=blog.lsonline.fr) --- ## Web Part alternatives If you prefer to use a table of contents as a Web Part, some contributors of PnP have already developed two alternatives: - A Web Part component that you can put into your page content (into the vertical section for example): [https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-page-sections-navigation](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-page-sections-navigation?ref=blog.lsonline.fr) - A solution based on two Web Parts that allows sticking some anchors to the top of the page content: [https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-page-sections-navigation](https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-page-sections-navigation?ref=blog.lsonline.fr) Hoping this post will help you ? ### How to Recover SharePoint 2013 SUSPECT Databases URL: https://blog.lsonline.fr/2020/05/13/how-to-recover-sharepoint-2013-suspect-databases/ Last updated: 2026-01-27T18:53:49.000Z After several updates on SQL and SharePoint servers all night long, the next day, it is not possible to access the SharePoint Central Admin anymore... Here is an old memo (April 2015) that I stored that can be useful for someone else. ## The Issue After a long night of updates on some SQL and SharePoint servers which resulted in a reboot on each of them; the next morning, an error message had replaced the SharePoint Central Administration: ![](https://blog.lsonline.fr/content/images/2020/05/SP_CA_Error_Application.png) To fix it, you can check: - The SQL Server is correctly rebooted and operational - The IIS Application Pools are "start" - The Windows Events logs In my case, a SharePoint Foundation (3760) critical error is logged: ```plaintext SQL Database 'SharePoint_Config' on SQL Server instance 'dev' not found. Additional error information from SQL Server is included below.Cannot open database "SharePoint_Config" requested by the login. The login failed.Login failed for user 'SPS\SPFarm'. ``` Thus, there is a problem of connexion to the database and more especially to the "[SharePoint\_Config](https://docs.microsoft.com/en-us/sharepoint/technical-reference/database-types-and-descriptions?ref=blog.lsonline.fr#sharepoint-server-system-databases)" one, which is essential to the proper functioning of SharePoint. It is necessary to check the database, thanks to [SQL Server Management Studio](https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15&ref=blog.lsonline.fr), and note that several databases are switched in **Suspect** mode. ![](https://blog.lsonline.fr/content/images/2020/05/Suspect_Flag_DB_SQLServer.png) **What is the Suspect mode into SQL Server?** At that point, the suspect databases cannot be used anymore; cannot be read nor write. The Suspect mode can originate from several reasons like: - Database files inaccessible or corrupted (frequently due to insufficient disk space) - Hardware failure (unexpected physical reboot) - SQL Server crash - etc. ## The Solution Now that we know the cause, here are the steps to fix this issue: 1. Open SQL Server Management Studio 2. Open a new SQL Query page ![](https://blog.lsonline.fr/content/images/2020/05/LsOnline-SuspectDB-NewSQLQueryTab.jpg) 1. Execute the following queries one after another: ```SQL -- Use the Master database Use Master -- Verify that database has issues EXEC sp_resetstatus 'SharePoint_Config' ``` This query will disable the suspect database flag. Now: ```SQL ALTER DATABASE SharePoint_Config SET EMERGENCY ``` This query allows switching the database into EMERGENCY mode. You can note that the database becomes red with the (Emergency) suffix: ![](https://blog.lsonline.fr/content/images/2020/05/SharePoint_config-database-is-set-to-emergency-mode.png) ```SQL DBCC checkdb('SharePoint_Config') ``` This query allows checking the physical and logical integrity of objects in the database. Finally, execute the latest following requests: ```SQL -- Set the database in single user mode ALTER DATABASE SharePoint_Config SET SINGLE_USER WITH ROLLBACK IMMEDIATE -- Repair the database with data loss DBCC CheckDB ('SharePoint_Config', REPAIR_ALLOW_DATA_LOSS) -- Set the database in multi-user mode ALTER DATABASE SharePoint_Config SET MULTI_USER -- Verify that database is reset EXEC sp_resetstatus 'SharePoint_Config' ``` That's it ? Hoping this post will help you ? ### Configure Google Tag Manager for SharePoint URL: https://blog.lsonline.fr/2020/04/22/configure-google-tag-manager-for-sharepoint/ Last updated: 2026-01-27T18:53:44.000Z In this blog post, we will see how to open a free account of Google Analytics (not Analytics 360 for enterprise) and how to implement a basic configuration. > \[success\]**Tip** > > If you do not know if the free version is sufficient, feel free to check the Google compare: [https://marketingplatform.google.com/about/analytics-360/compare/](https://marketingplatform.google.com/about/analytics-360/compare/?ref=blog.lsonline.fr) ## Create a Google Account If you already have a Google account, you can skip this step, otherwise, the first step is to create an account that allows you to enable the Google services (linked to this account) and configure them. Fill out the following form to create a new Google account: [https://accounts.google.com/signup](https://accounts.google.com/signup?ref=blog.lsonline.fr). ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-TagManager-CreateGoogleAccuntForm.jpg) Create a Google Account form ## Enable Google Analytics With your Google account, enable the Google Analytics service and create your first analytics account from this URL: [https://analytics.google.com/analytics/web/provision](https://analytics.google.com/analytics/web/provision?ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-GAInstance-page.jpg) Provisioning Google Analytics page 1. Click on **Set up for free** or **Start measuring** button 2. Specify an **Account name** ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-Step01OpenGA-1.jpg) Create Google Analytics form - Account name 1. From the area **Account Data Sharing Settings**, keep the cases checked or uncheck them in accordance with your organization policies 2. Click **Next** 3. Choose **Web** measure *(selected by default)* 4. Click **Next** 5. Specify a **Website Name** *(example: Intranet)* 6. Specify the **Website URL** *(site collection or whole Tenant. Example: [https://contoso.sharepoint.com](https://contoso.sharepoint.com/?ref=blog.lsonline.fr))* 7. Specify **Industry Category** and **TimeZone** in accordance with your organization 8. Click **Create** ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-Wizard-FirstGA.jpg) Google Analytics create an account - First default account 1. Accept the Google Analytics Terms of Service Agreement You are redirected to the **ADMIN** area and you should see your first **Tracking ID**. ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-Admin-FirstTrackingID.jpg) Google Analytics admin area If you already have an account and you want to create a new one: - Go to the **ADMIN** and click on the button `+ Create Account`. Then, follow the steps of this chapter from point **[2](#create-ga-accont-step2)** or an instance (property) and you want to create a new one: - Go to the **ADMIN** and click on the button `+ Create Property`. Then, follow the steps of this chapter from point [**5**](#create-ga-accont-step5) > \[note\]**Note** > > Keep the Tracking ID in mind because we will need it later ## Configure Google Analytics instance (property) From this chapter, your Google Analytics property is ready to record activity. If you wish Google Analytics to detect when your users perform an internal search (SharePoint search), an additional configuration is required. 1. From the **ADMIN** area, click on the **View Settings** under the *View column* ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-Admin-ViewSettings.jpg) Configure default Google Analytics view 1. At the bottom of the page, enable **Site search Tracking** 2. Into the **Query parameter** field, insert **`q,query,k,keyword`** > \[note\]**Note** > > If you use the default SharePoint modern search, when a user perform an internal search, the URL parameter that contains the keywords is "**q**". The other options can be useful. ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GA-Admin-ConfigSearch.jpg) Configure Google Analytics internal search 1. Click **Save** At this step, you can already use the Google Analytics SharePoint Extension [Setup Google Analytics to Modern SharePoint from any platformImplement Google Analytics to your Modern SharePoint sites from any platform![](https://blog.lsonline.fr/assets/favicon/apple-touch-icon.png?v=49191d36ea)LsOnlineLaurent Sittler![](https://blog.lsonline.fr/content/images/2019/02/LsOnline-GA-Banner-1.jpg)](https://blog.lsonline.fr/2019/02/07/setup-google-analytics-to-modern-sharepoint-from-any-platform/) ## Enable Google Tag Manager With your Google account, enable the Google Tag Manager from this URL: [https://tagmanager.google.com/](https://tagmanager.google.com/?ref=blog.lsonline.fr) 1. Click on the button **Create Account** ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-CreateAccountBtn.jpg) Create Google Tag Manager Account 1. Fill out the form - **Account Name**: company name or all other significant names - **Country**: your country - **Container**: because you can have several containers into the same account, you can set the name of your application (example: Intranet) - **Target platform**: in our case, SharePoint is a **Web** platform 2. Click **Create** 3. Accept the Google Tag Manager Terms of Service ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-CreateNewAccount.jpg) Create a new Tag Manager Account forms From the *Google Tag Manager workspace* or the *Tag Manager Home* page (the URL at the beginning of this chapter) you can see the Tag Manager Tracking ID. ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-TrackingID.jpg) Google Tag Manager Tracking ID from Workspace ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-HomePage-TrackingID.jpg) Google Tag Manager Tracking ID from Tag Manager Home Page ## Configure Google Tag Manager Now, your Google Tag Manager is ready to be used but in this state, you do not send any data into your Google Analytics. Google Tag Manager does not work alone. Google Tag Manager is a sort of "Layer" over Google Analytics that allows you to configure custom events, tags, and triggers. It does not store/record the KPI; it is the job of Google Analytics to store and create reports/dashboards. To allow your Tag Manager to send data to your Google Analytics, follow these steps: 1. From your Tag Manager workspace, select the **Tags** from the left navigation 2. Click on the button ****New** to create a new Tag 3. From the ****Tag Configuration** area, click on the pen *(the pen appears when the cursor is hovering the area)* ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-NewTagGA.jpg) Create a new Tag to add Google Analytics 1. Select the feature **Google Analytics: Universal Analytics** ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-GAConnector-feature.jpg) Google Analytics connector for Google Tag Manager 1. Choose a **title** of the Tag *(example: Google Analytics)* 2. Define the **Google Analytics Settings** by adding a new variable 3. Define a **title** of this variable *(example: Google Analytics Tracking ID)* 4. In this new variable, define the **Google Analytics Tracking ID** generated in the chapter [Enable Google Analytics](#enable-google-analytics) 5. Click **Save** ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-NewGATrackingIdvariable.jpg) Google Tag Manager variable to store the Google Analytics Tracking ID *After clicking on the button *Save*, you will be redirected to the previous tag creation (Google Analytics).* 1. From the **Triggering** area, click on the pen *(the pen appears when the cursor is hovering the area)* 2. Select the **All Pages** trigger *(that means, the Tag Google Analytics will be triggered for each page that includes the Tag Manager script)* 3. Click **Save** ![](https://blog.lsonline.fr/content/images/2020/04/LsOnline-GTM-GATagConfig.jpg) Google Analytics Tag configuration for Tag Manager Now, your configuration is ready. The last thing to do is to **Submit** your workspace configuration (it is like a Publish) and include the solution to your SharePoint pages. At this stage, you have the same capabilities as Google Analytics only. For all additional events, tags and triggers, you have to configure your workspace and send the data to your Google Analytics. Hoping this post will help you ? ### An approach to manage the versions of PnP PowerShell module URL: https://blog.lsonline.fr/2020/03/14/an-approach-to-manage-the-versions-of-pnp-powershell-module/ Last updated: 2026-01-27T18:53:41.000Z If you are a developer who uses PnP PowerShell module to deploy and configure your environment or your clients', you have certainly faced some issues to manage the versions of PnP PowerShell module with your scripts. I will share with you an approach that I am using myself to use my current scripts and the old ones easier while dealing with the appropriate PnP PowerShell version. ## Install module This first step is downloading a version of PnP PowerShell Module in accordance with your environment from the official GitHub repository: [SharePoint/PnP-PowerShellSharePoint PnP PowerShell CmdLets. Contribute to SharePoint/PnP-PowerShell development by creating an account on GitHub.![](https://github.githubassets.com/favicon.ico)GitHubSharePoint![](https://repository-images.githubusercontent.com/39578264/549b7180-69d3-11e9-981a-2178dfcd7aa7)](https://github.com/SharePoint/PnP-PowerShell/releases?ref=blog.lsonline.fr) - `**SharePointPnPPowerShell2013.msi**`: for SharePoint 2013 On-Premise only - `**SharePointPnPPowerShell2016.msi**`: for SharePoint 2016 On-Premise only - `**SharePointPnPPowerShell2019.msi**`: for SharePoint 2016 On-Premise only - `**SharePointPnPPowerShellOnline.msi**`: for SharePoint Online only Once downloaded, you can install it on your computer: 1. Launch the executable (`.msi` file) ![](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-install.jpg) 1. Accept the terms in the Licence Agreement and click on **Advanced** ![LsOnline-PnPVersionMngt-install-step01](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-install-step01.jpg) 2. Choose **Install for all users of this machine** (it is easier to retrieve the path of files) ![LsOnline-PnPVersionMngt-msi-step02](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-step02.jpg) 3. If necessary, you can change the path of the PowerShell module, but I suggest you to keep the default path. Copy this one for later ![LsOnline-PnPVersionMngt-msi-step03](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-step03.jpg) 4. Now, click on **Install** then **Finish** That's it! The PnP PowerShell module is now installed and available from a Windows PowerShell. If you wish to change the version, you have to remove the current version and then download and install a new one. At this time, you can meet two issues: 1. your version is not the latest one and you want to run the newest scripts that use some cmdlets that do not exist with your version - you have to uninstall the current version and install the latest one 2. your version is the latest one and you want to run the oldest scripts - you can have some errors because some cmdlets do not exist anymore - you have to uninstall the current version and install the previous one in accordance with your script In both cases, you then have to either uninstall the current version and use the same than previously to keep working, or update your scripts to work with this other version. ## Manage version Rather than uninstall and install another version of the PnP PowerShell module each time you need to change the version, you can keep each library locally and use the good one "On Demand". In the previous chapter, the *PnP PowerShell module setup* has installed the library to `C:\Program Files (x86)\SharePointPnPPowerShellOnline\` by default. ![](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-Install-folder.jpg) The default location of PnP PowerShell library files The idea is to copy all of the files from this folder to a new one. To manage the versions easier, create a folder with this pattern for each version `****[YYYY][MM][-XX]**`. Examples: - **202002**: module released February 2020 - **202001-01**: module released January 2020\. This is an intermediate release, this is why I added `-01`. Increase this number for each intermediate release in the same month of the year - **202001**: module released January 2020 To access easily these folders, keep an easy path, without special char, no space, like: ``` C:\PnP\SharePointPnPPowerShellOnline ``` Here, an example of my "versioning" folders: ![](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-version-folders.jpg) Screenshot of my PnP PowerShell folders perversion ## Use a specific version in your PowerShell session Now that you have stored each version that you need, how could you use them? Before trying to execute some *PnP* cmdlets from *PowerShell ISE* or a *Windows PowerShell*, you have to add manually the module like this: ```PowerShell $dllPath = "C:\PnP\SharePointPnPPowerShellOnline\202001" $dllClientPath365 = Join-Path $dllPath "Microsoft.SharePoint.Client.dll" $dllRuntimePath365 = Join-Path $dllPath "Microsoft.SharePoint.Client.Runtime.dll" $dllConnectPath365 = Join-Path $dllPath "SharePointPnP.PowerShell.Online.Commands.dll" Import-Module $dllConnectPath365 Add-Type -Path $dllClientPath365 Add-Type -Path $dllRuntimePath365 ``` > \[warning\]**Warning** > > For the next versions (after July 2020) of PnP PowerShell , the `SharePointPnP.PowerShell.Online.Commands.dll` was renamed to `PnP.PowerShell.Online.Commands.dll` > \[info\]**Important** > > It is not recommended to run a PnP PowerShell script with two or more versions of the same module. That can generate some errors. Here an example after importing the module while an other version is installed on the computer: ![](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-SeveralModules.jpg) PnP Connect cmdlet result from ISE when several versions are available To avoid this kind of annoyance, please ensure you have uninstalled the version on your computer via the installer. To remove the version installed on your computer, follow the below steps or use the "**Add or remove programs**": 1. Launch the executable (`.msi` file) ![](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-install.jpg) 1. On the select operation section, choose **Remove** ![LsOnline-PnPVersionMngt-msi-Remove](https://blog.lsonline.fr/content/images/2020/03/LsOnline-PnPVersionMngt-msi-Remove.jpg) At this point, you can execute PnP PowerShell cmdlets. If you want to switch the module version, close the current Windows PowerShell and reuse the code above by changing the `$dllPath` variable: ```PowerShell $dllPath = "C:\PnP\SharePointPnPPowerShellOnline\202003" ``` Change PnP library path to use the March release version ## Manage the Latest versions and your Packages As you know, this module is deprecated and the latest versions can not be installed in the same way as the versions see above. This part explains to you where you can found the latest versions, how to download them, and manage them without the `.msi` installer. _This post is for subscribers only._ ### A scroll back to top SPFx extension for SharePoint URL: https://blog.lsonline.fr/2020/02/27/a-scroll-back-to-top-spfx-extension-for-sharepoint/ Last updated: 2026-01-27T18:53:39.000Z By having some SharePoint modern pages with a lot of content, you can make it easier for your final users by adding a button that allows them to go back to the top of the page easier ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-SPFx-ScrollToTop.gif) Scroll To Top demo ## How to install this extension If you want to install this extension for all site collections of your Tenant, the easiest way is to deploy it into your Tenant App Catalog directly. You can just add the extension with a *drag & drop* of the [package](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/scrollToTop/-/releases?ref=blog.lsonline.fr) `.sppkg` into the **Apps for SharePoint** library or by clicking on **Upload**. Once done, a modal will appear to deploy the package. If you want to deploy and enable the extension for all sites collections in your Tenant, check the case *"Make this solution available to all sites in the organization"* and click **Deploy** ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-ScrollToTop-DeploySPModal.jpg) SharePoint modal to deploy package from App Catalog Once deployed for all sites, you can go on whatever sites collection and you should see something like this: ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-ScrollToTop-DefaultConfigResult.jpg) Default scroll to top If the default configuration is not what you want, you can change: - The shape (`square` or `circle`) - The UI Fabric icon - The duration of scrolling to the top of the page > \[note\]**Note** > > The button use the primary color of the site theme If you wish to edit the configuration, you have to go to the "Tenant Wide Extensions" list located in your Tenant Apps Catalog (only available on the Tenant Apps Catalog) ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-ScrollToTop-AppsCatalogSiteContent.jpg) SharePoint Tenant Wide Extensions list located into the Tenant Apps Catalog Find the item with the `Component Id` equals at `ba2540fe-8c92-4b95-99fb-04b074c82b13`: ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-ScrollToTop-EditTenantWideExtItem-1.jpg) SharePoint Tenant Wide Extensions list items Edit the `Component Properties` of the item like this (for example): ```JSON {"scrollDuration":null,"buttonIcon":"Up","shape":"circle"} ``` Example of custom configuration Save the item and go on whatever sites collection and you should see something like this: ![](https://blog.lsonline.fr/content/images/2020/02/LsOnline-ScrollToTop-CustomConfigResult.jpg) Custom scroll to top --- If you want to deploy this extension only on one or several specific site collections, you have to enable a Site Collection Apps Catalog on each of them. Then, I suggest you use the provided setup scripts available in the repository. [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Scroll to Top repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/scrollToTop?ref=blog.lsonline.fr) Hoping this post will help you ? ### How to install your SPFx solution to SharePoint? URL: https://blog.lsonline.fr/2020/02/19/how-to-install-your-spfx-solution-to-sharepoint/ Last updated: 2026-01-27T18:53:39.000Z You have developed or got an SPFx solution, a Web Part, or an extension but you do not know how to deploy and install it on your environment? This post will explain to you the different ways to deploy and install this kind of solution quickly and easily on your SharePoint environment. ## App Catalog Once you have built or got an SPFx package (file with `.sppkg` extension), to allow all users of a site collection or all users of your SharePoint environment (whole Tenant) to use it, you have to add this one in an **App Catalog**. The first thing you have to know is, who needs to have access to it. If all users in your organization need to have access to it, the best choice should be to deploy the component into the Tenant App Catalog. On the opposite, if only a couple of users needs to have access to it, you should deploy the component on one or several sites collections App Catalog that need it. ### Tenant App Catalog The first thing you have to know is, whatever the scope of visibility of your solution (Tenant or Site collection) you chose, you have to create a Tenant App Catalog and have sufficient rights to access it and manage the content (apps). If you do not know if a Tenant App Catalog is already existing, you can directly check from the SharePoint API URL : ```HTTP https://yourdomain.sharepoint.com/_api/SP_TenantSettings_Current ``` *the value is available from the XML node ``* or you can use PnP PowerShell cmdlet: ```PowerShell Get-PnPTenantAppCatalogUrl ``` or you can use Office 365 CLI command line: ```bash spo tenant appcatalogurl get ``` ### Site Collection App Catalog If you chose this solution to deploy your package, you assume you indeed have a Tenant App Catalog and App Catalog on the target site collection. To create a site collection App Catalog, there is no other way than to use PowerShell. You can use SharePoint PowerShell manager cmdlet: ```PowerShell Add-SPOSiteCollectionAppCatalog -Site https://yourdomain.sharepoint.com/sites/targetsitecollection ``` or PnP PowerShell cmdlet: ```PowerShell Add-PnPSiteCollectionAppCatalog -Site https://yourdomain.sharepoint.com/sites/targetsitecollection ``` or Office 365 CLI command line: ```bash spo site appcatalog add --url https://yourdomain.sharepoint.com/sites/targetsitecollection ``` > \[note\]**Note** > > The user account has to be SharePoint Administrator at least to create a site collection App Catalog ## Install > \[note\]**Note** > > If your solution provides a deployment script, you should first take into account the documentation written about it Once: - your *App Catalog* is ready - you know the URL - you can access it with sufficient permissions you can follow the steps below: 1. Get the `.sppkg` file (by building the solution or downloading the package directly if provided) ### Manually 1. Go to your site collection (Tenant App Catalog or target site collection) 2. Open the **Apps for SharePoint** library. The URL of the library is: `https://yourdomain.sharepoint.com/[sites/teams]/yoursitecollection/AppCatalog/Forms/AllItems.aspx` 3. You can *drag and drop* the `.sppkg` file or click on **Files β€Ί Upload Document** ![LsOnline-SPAppsInstall-DragAndDropSppkg](https://blog.lsonline.fr/content/images/2020/02/LsOnline-SPAppsInstall-DragAndDropSppkg.jpg) 4. Once uploaded, a dialog will appear. This dialog will allow you to deploy your solution after clicking on **Deploy**. ![LsOnline-SPAppInstall-DeployModalDialog](https://blog.lsonline.fr/content/images/2020/02/LsOnline-SPAppInstall-DeployModalDialog.jpg) > \[note\]Note > > some solutions can be deployed and installed directly on all site collections in your Tenant if you check the checkbox *"Make this solution available to all sites in the organization"* (this option is only available if the `package-solution.json` has the parameter `skipFeatureDeployment` with the value at `true`) If your solution was deployed and installed on all sites in your organization, then you can skip the next step. 1. Go to the SharePoint site collection that needs your solution. **Add an app** (from the gear located at the *Microsoft 365 ribbon* or from the **Site Contents β€Ί New β€Ί App**) and click on your solution ![LsOnline-SPAppInstall-AddInstanceToSC](https://blog.lsonline.fr/content/images/2020/02/LsOnline-SPAppInstall-AddInstanceToSC.jpg) Once installed, you can see the instance of your solution from the Site Contents ![LsOnline-SPAppInstall-CheckInstanceFromSiteContents](https://blog.lsonline.fr/content/images/2020/02/LsOnline-SPAppInstall-CheckInstanceFromSiteContents.jpg) Now, your solution is ready to use. You have done ?? ### Programmatically 1. Connect to the site collection that hosts your App Catalog with the PnP PowerShell cmdlet: ```powershell Connect-PnPOnline -Url https://yourdomain.sharepoint.com/sites/yoursitecollection ``` or with Office 365 CLI command line: ```bash spo login ``` 2. Upload the package to the library with the PnP PowerShell cmdlet: ```powershell Add-PnPApp -Path ./yourapp.sppkg ``` or with the Office 365 CLI command line: ```bash spo app add --filePath ./yourapp.sppkg --appCatalogUrl https://yourdomain.sharepoint.com/sites/yoursitecollection ``` 3. Deploy the package with the PnP PowerShell cmdlet: ```powershell Publish-PnPApp -Identity 00000000-0000-0000-0000-00000000000 -SkipFeatureDeployment ``` or with Office 365 CLI command line: ```bash spo app deploy --id 00000000-0000-0000-0000-00000000000 --skipFeatureDeployment ``` > \[success\]Tip > > You can find the ID of your solution on the `package-solution.json` file > \[note\]Note > > The parameter `skipFeatureDeployment` works only if the `package-solution.json` of the package has value at `true` If your solution was deployed and installed on all sites in your organization, then you can skip the next step. 1. Install your solution on the site collection(s) that need it with the PnP PowerShell cmdlet: ```powershell Connect-PnPOnline -Url https://yourdomain.sharepoint.com/sites/targetsitecollection Install-PnPApp -Identity 00000000-0000-0000-0000-00000000000 ``` or with Office 365 CLI command line: ```bash spo app install --id 00000000-0000-0000-0000-00000000000 --siteUrl https://yourdomain.sharepoint.com/sites/targetsitecollection ``` Now, your solution is ready to use. You are done ?? --- ## Developers If your organization has deployed an SPFx component into the Tenant App Catalog, you can even use the site collection App Catalog to try your component in the same environment. The site collection App Catalog takes priority over the Tenant App Catalog. Hoping this post will help you ? ### Unit converter URL: https://blog.lsonline.fr/2020/02/10/unit-converter/ Last updated: 2026-07-29T14:15:37.000Z In informatics, you sometimes have to know how many mega-octets equal *629145600* octets. You can easily find several online converters, but what is a good unit converter? Do you think 1 giga-octet equals 1 000 mega-octets? That is not totally true ? If you have to configure a server that requests the resource (often the [**RAM**](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[ \= ](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[**R**](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[andom ](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[**A**](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[ccess ](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[**M**](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)[emory](https://en.wikipedia.org/wiki/Random-access%5Fmemory?ref=blog.lsonline.fr)) and you define it for 1 Go, 1000000000 octets, you will certainly have a surprise... Because 1 Go = 1024 Mio = 1073741824 octets. Did you see `Mio` rather than `Mo`? Mo is the SI Prefix (System of Units) and Mio is the Binary Prefix... This is a big difference in informatics. > \[note\]**Note** > > For more information about the conversion and more theory, Wikipedia is smarter than me: [https://en.wikipedia.org/wiki/Octet\_(computing)](https://en.wikipedia.org/wiki/Octet%5F%28computing%29?ref=blog.lsonline.fr) Anyway, I often look for an online converter when I need it quickly; when I forget the URL of a good online converter, I have to search again and I recently didn't find my favorite converter anymore ? Now, rather than looking for a converter, I created my own one on this post and I think it could be useful to someone else ? --- Converter Octets Ko Mo Go To Po bits octets Ko Mo Go To Po --- Hoping this post will help you ? ### Exploring the "Request Files" feature of OneDrive URL: https://blog.lsonline.fr/2020/01/04/exploring-the-request-files-feature-of-onedrive/ Last updated: 2026-01-27T18:53:19.000Z How can the "Request Files" feature on OneDrive be useful in your organization and why does this feature improve your security? This new feature of OneDrive rolled out last December and can be really useful to create a target folder and allow external people of your organization to deposit some files safely (for your organization). How can this feature be better than sharing a folder with each other? > \[note\]**Note** > > This feature is only available for OneDrive for Business > \[info\]**Important** > This feature is not available for Office 365 Government, Office 365 operated by 21Vianet, OneDrive for home, or Office 365 Germany. ## Share folder Without the "Request files" feature, to allow someone else to deposit/drop/upload something on your OneDrive, you have to share a folder. Sharing a folder with the native feature means: - Allow user(s) to see the content of this folder - Allow user(s) to edit the content of this folder (if you want them to be able to drop files) - The recipients have to have at least a Live ID account ![](https://blog.lsonline.fr/content/images/2020/01/Screen-Shot-2020-01-03-at-10.58.04.png) Allow editing when sharing folder to allow upload files on your OneDrive If you share this same folder with several users to let them upload files, all of them will have the exact same rights and will be able to access the content of each other... is this really what you want? ? *One solution consists of creating each time a shared folder to avoid this kind of use case...* ## Request files Now, you have an alternative since December 2019 to allow someone to drop files on your OneDrive (this feature is not available on SharePoint sites); you can create a "Request files"! ? Before explaining to you the benefits of this feature, I will show you how to use it. ### Prerequisites The external sharing for **Anyone** has to be enabled on your Tenant. To enable it, go to your Microsoft 365 Central Admin ⟩ SharePoint ⟩ from the left navigation, under Policies, click on **Sharing** link. ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-Prerequisites-ShareWithAnyoneOneDrive.jpg) External Sharing level on Microsoft 365 Tenant > \[note\]**Note** > > To allow OneDrive at the most permissive sharing, SharePoint has to be set up at the same level too. Once configured, click on **Save**. > \[success\]**Tip** > > For more security and to avoid infinite external sharing links, set up a link expiration in day is recommended. ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-ExpirationSharingLinks.jpg) Define an expiration option for anyone links of sharing For more information about external sharing, find below the link of Microsoft docs: [Turn external sharing on or off - SharePoint OnlineLearn how to change your SharePoint sharing settings.![](https://docs.microsoft.com/favicon.ico)Microsoft DocsMikePlumleyMSFT![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/sharepoint/turn-external-sharing-on-or-off?ref=blog.lsonline.fr) ### Create a file request Here, are the steps to create a *Request files*: 1. From your *OneDrive*, create or use an existing folder 2. Select the folder for which you want to perform a *Request files* 3. From the `Command Bar` or the `Contextual Menu` (click on ellipsis), click on **Request Files** ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-Buttons.jpg) Button actions to create a "Request files" > \[note\]**Note** > > Multiple selection is not supported 1. A modal dialog appears; specify a description of what kind of files is expected (for a project, a procedure, etc.) and click **Next** ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-DescriptionMD.jpg) Enter a description to precise the purpose of your request files 1. Your **Request files** are ready now; you can use and share the provided link (via mail for example) and/or share it directly by specifying the mail addresses of the recipients ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-SendFileRequest.jpg) Send your request files > \[warning\]**Warning** > > If you specify recipient(s), the behavior will not be the same for the user that performs the upload (see [Upload files as recipient](#request-files-recipient-chapter) part) ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-RequestSendConfirmed.jpg) Confirmation of request files sent You will find the procedure and more on the following Microsoft support: [Create a file requestThis feature is currently rolling out and should be fully available by the end of December.![](https://www.microsoft.com/favicon.ico?v2)OneDrive![](https://support.office.com/SocImages/SOC_SharingImage_720x405.png)](https://support.office.com/en-us/article/create-a-file-request-f54aa7f8-2589-4421-b351-d415fc3b83af?ref=blog.lsonline.fr) ### Upload files as recipient As a recipient, if the invitation was sent directly via OneDrive, you should receive an email like this one: ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-EmailRequestRecipients.jpg) Request files email 1. Click on the button **Upload Files** or use the link that was shared with you; that will open your favorite browser at this page: ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFile-RecipientInvitation.jpg) The first-page link of request files 1. Select file(s) to be uploaded; the next behavior changes in accordance with the invitation with the recipient(s) (left screenshot) or with no recipient specified (right screenshot) ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-UploadWithSpecifiedRecipient.jpg) ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-UploadWithNoRecipient.jpg) ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-UploadSuccessWithSpecifiedRecipient.jpg) ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-UploadSuccessWithNoRecipient.jpg) Upload files to the request folder as a specified user (left) and as anonymous/guest (right) 1. Click on **Upload** ### The result from the requester side As a requester, each time someone uploads file(s) via the link *Request Files*, an email is sent for notification. ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-EmailNotif_WithRecipientRequest.jpg) ![](https://blog.lsonline.fr/content/images/2020/01/LsOnline-RequestFiles-EmailNotif_WithNoRecipientRequest.jpg) Mail notification once files were uploaded into the request folder > \[note\]**Note** > > Even if several files were uploaded, only the first one is mentioned into the mail Here, is the request folder with the uploaded files: ![](https://blog.lsonline.fr/content/images/2020/01/Screen-Shot-2020-01-03-at-14.40.49.png) Request folder with files Some notes about the behavior of the uploaded files: - If the *Request files* link has no recipient, each file is identified by a prefix which was inserted into the file name like: `FirstName_LastName_File name.ext` - If the *Request files* link has no recipient, the `Created By`, `Modified By` and `Activity` are identified by **Guest Contributor** - If the request files link has recipient(s), each file is identified by a prefix which was inserted into the file name like: `Full Name_File name.ext` - If the request files link has recipient(s), the `Created By`, `Modified By` and `Activity` are identified by a user name who uploaded the files ### Benefits - The people who have the link can not see the content of the folder and can not edit, download or delete something - Specific activity is dedicated to the dropped files - Each document has a prefix to identify easily who were uploading the files - The user profile is "anonymous" (without Live ID or Office 365 account) and if the shared link had no recipient specified, `Create By` and `Modified By` are identified by **Guest Contributor** - Like a *sharing* link, the *Request files* link expires automatically in accordance with the expiration option defined on the Tenant - A better user experience to drop some files easily and safety ### Point to consider Although this feature brings a lot of benefits, there are a few things to consider: - Anyone who knows that the link can upload files into your OneDrive without having himself a OneDrive account - Even if the recipient has a OneDrive account and is connected to his account, he can change the first name and last name - The prerequisites impact the sharing behavior of the whole Tenant - Once a request file was created, the permissions inheritance stopped. If the link is deleted, it is necessary to consider restoring the permissions inheritance [Restore inheritance after sharing or copying a link OneDrive/SharePoint OnlineWhat are the side effect when you are sharing/generate an access link of SharePoint item? Restore permissions inheritance after sharing file or folder to someone else who is internal or either external of your company on Office 365![](https://blog.lsonline.fr/assets/favicon/apple-touch-icon.png?v=9ffca1ef0e)LsOnlineLaurent Sittler![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-Office365-SharingBehavior.jpg)](https://blog.lsonline.fr/2019/05/29/restore-inheritance-after-sharing-or-copying-a-link-onedrive-sharepoint-online/) --- More link(s): [Create a file request![](https://support.microsoft.com/apple-touch-icon.png)![](https://support.content.office.net/en-us/media/c72983bf-15a2-4fdd-9979-5ea5586f9688.png)](https://support.microsoft.com/en-us/office/create-a-file-request-f54aa7f8-2589-4421-b351-d415fc3b83af?ref=blog.lsonline.fr) [OneDrive Roadmap Roundup- November 2019As we wrap up an exciting quarter filled with innovations and announcements, we have some great features to share with you. Here is the latest and greatest that landed in production in the month of November 2019\. Save for Later Request files Language localization for OneDrive emails Save for …![](https://gxcuf89792.i.lithium.com/html/assets/favicon2.ico)TECHCOMMUNITY.MICROSOFT.COMAnkita Kirti![](https://gxcuf89792.i.lithium.com/t5/image/serverpage/image-id/154210iB65054CBD1A7F0D2?v=1.0)](https://techcommunity.microsoft.com/t5/Microsoft-OneDrive-Blog/OneDrive-Roadmap-Roundup-November-2019/ba-p/1054066?ref=blog.lsonline.fr) Hoping this post will help you ? ### Speaking at SharePoint Saturday Toronto 2019 URL: https://blog.lsonline.fr/2019/11/15/speaking-at-sharepoint-saturday-toronto/ Last updated: 2026-01-27T18:53:16.000Z This year, for the first time, I have the opportunity to speak at the SPS Toronto and I'll be presenting "****Introduction to GitHub: Getting Started with SharePoint solutions and GitHub**". You know GitHub, especially since Microsoft has purchased it, but do you have all the tools to get started? During this session, we will see the different elements to implement in your SharePoint projects hosted on GitHub to promote the work between developers and the maintenance of your solutions. If you’re in the area ****Saturday, November the 23th 2019** don’t hesitate to register for the event [here](http://www.spsevents.org/city/toronto/toronto2019?ref=blog.lsonline.fr). Just as a reminder, SharePoint Saturdays are educational, informative, and lively events filled with sessions, covering a wide variety of SharePoint-orientated topics. SharePoint Saturday is FREE and open to the public! This is a great opportunity to expand your network, learn a lot of things and have a good day. The event takes place at Microsoft Toronto. [Getting Started with SharePoint solutions and GitHubYou know GitHub, especially since Microsoft has purchased, but do you have all the tools to get started? During this session, we will see the different element…![](https://public.slidesharecdn.com/favicon.ico?d8e2a4ed15)SlideShare AndroidLaurent S.![](https://cdn.slidesharecdn.com/ss_thumbnails/lsittler-spstoronto2019-github-191123195705-thumbnail-4.jpg?cb=1574539189)](https://www.slideshare.net/LaurentSittler/getting-started-with-sharepoint-solutions-and-github?ref=blog.lsonline.fr) ### Speaking at QuΓ©bec SharePoint Users Group URL: https://blog.lsonline.fr/2019/10/22/speaking-at-quebec-sharepoint-users-group/ Last updated: 2026-01-27T18:53:13.000Z On November 5th, I volunteered to speak at *QuΓ©bec SharePoint Users Group*. I’ll be presenting several ways to get some SharePoint KPI based on third analytics tools. During this presentation, I'll show you the "new" native solution provided by Microsoft and two-third analytics tools: - Google Analytics - Matomo Analytics (Piwik) Since Google Analytics is known by a lot of people, I'll focus on the Matomo Analytics solution installed locally through a Docker container and used via a SharePoint Framework extension. After that, I'll have the occasion to talk to you about my Open Source projects and contributions. If you can make it to the Microsoft in MontrΓ©al, come join the user's group, it is free and everyone is super friendly ? Don’t forget to register for the meetup event [here](https://www.meetup.com/guspquebec/events/265742399/?ref=blog.lsonline.fr). ### Microsoft Graph API or SharePoint REST API? URL: https://blog.lsonline.fr/2019/10/04/microsoft-graph-api-or-sharepoint-rest-api/ Last updated: 2026-01-27T18:53:09.000Z The technologies around SharePoint and Office 365 never stop offering a wide range of solutions to access data. The facts are, in a SharePoint context, on one side, the developers have to choose which gateway they have to take for their developments and on the other side, the number of customers who are interested in the way we access their data even if they are not developers, become increasingly important: - what are the differences? - which is the easiest? - which is the most secure? - since Microsoft Graph is newer than SharePoint REST API, why do not use it directly for the new developments? - how to choose between them? I will try to explain all of this as simple as possible based on my own experience ? ## SharePoint REST API Why specify "SharePoint" REST API? ? - **API**: *Application Programming Interface* \- allows communicating between two software programs through HTTP - **REST**: **RE*presentational *S*tate *T*ransfer* \- an architectural style for web services; essentially used by Microsoft SharePoint - **SharePoint**: it is the requested canal/server If developers want to perform REST API requests on a SharePoint server, they have to use this syntax: ```plaintext http://myowndomain.com/_api/[site|web|search|...]/[lists|siteusers|...]/... ``` On-Premise REST API request for a SharePoint On-Premises ```plaintext https://myowndomain.sharepoint.com/_api/[site|web|search|...]/[lists|siteusers|...]/... ``` SPO REST API request for a SharePoint Online. As you can guess, you need to know which endpoints you have to use to perform the C.R.U.D *(Create, Read, Update, Delete)* actions, not to mention that the URL has to correspond to your environment. ### Methods You can use the endpoints with different methods: - **GET**: essentially used to get/read data from SharePoint - **PUT**: honestly, I do not use it often ?... It is mostly used to update items of SharePoint but as you will see, you will be able to use the next method (POST) to do this too - **POST**: sometimes used to get specific kind of data (taxonomy, view result, etc.) but mainly used to perform the C.-.U.D ?; accompanied by a header `X-HTTP-Method` with the value `MERGE` to update or `DELETE` to delete something of course All the requests that send content to SharePoint, have to be authenticated. It is quite simple to get a "DIGEST" from SharePoint solution: ```javascript var digest = document.getElementById('__REQUESTDIGEST').value; ``` Get DIGEST from classic SharePoint site from a "classic" development (ex: custom action) ```TypeScript import { SPHttpClient, ISPHttpClientOptions, SPHttpClientResponse } from '@microsoft/sp-http'; ... this.context.spHttpClient.post('[URL]', SPHttpClientConfigurations.v1, headers: { ... }, body: { ... }) .then((response: SPHttpClientResponse) => { response.json().then((responseJSON: JSON) => { // the response ... }); }); ``` Send a request from an SPFx component from a SharePoint Framework (SPFx) development. ### Examples Here, a little example to illustrate the simplicity of usage: 1. If you wish to **CREATE** a SharePoint list, the URL you will use is `https://contoso.sharepoint.com/sites/myspsite/_api/web/lists` with the `POST` method and the body message in accordance with what SharePoint expects 2. If you wish to **READ** the SharePoint list, the URL you will use is `https://contoso.sharepoint.com/sites/myspsite/_api/web/lists(guid'00000000-0000-0000-0000-000000000000')` with the method `GET`. This request returns the list properties and not the content of it. If you wish to retrieve the content, just add `items` at the end of the URL 3. If you wish to **UPDATE** the SharePoint list, the URL you will use is `https://contoso.sharepoint.com/sites/myspsite/_api/web/lists(guid'00000000-0000-0000-0000-000000000000')` with the method `POST` and the header `X-HTTP-Method` with the value at `MERGE` 4. If you wish to **DELETE** the SharePoint list, the URL you will use is `https://contoso.sharepoint.com/sites/myspsite/_api/web/lists(guid'00000000-0000-0000-0000-000000000000')` with the method `POST` and the header `X-HTTP-Method` with the value at `DELETE` ### Links Here, the principle: [Get to know the SharePoint REST serviceBasics of using the SharePoint REST service to access and update SharePoint data, using the REST and OData web protocol standards.Microsoft Docsspdevdocs![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/get-to-know-the-sharepoint-rest-service?ref=blog.lsonline.fr) Here, some examples of usage provided by Microsoft: [https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-rest-reference/jj860569(v=office.15)](https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-rest-reference/jj860569%28v=office.15%29?ref=blog.lsonline.fr) Simple, isn't it? Your turn now ?? ## Microsoft Graph is a RESTfull API (ooohh!! just like SharePoint REST API) that allows accessing the SharePoint data but **not only**! With Microsoft Graph, you can access the wide resources provided by your Microsoft 365 Tenant. > \[note\]**Note** > > It also means that Microsoft Graph is only available for a SharePoint Online environment. If you have a On-Premise environment, you cannot use it - only SharePoint REST API can be used. Just like SharePoint REST API, the concept is exactly the same; the main difference is the URL: ```plaintext https://graph.microsoft.com/v1.0/sites/{site-id} ``` Example of Microsoft Graph URL Only one point (main URL) to access the whole data! Unlike SharePoint REST API, the developers have to explicitly identify the needed access used by the app and an administrator has to approve the access request(s) from the *API management* available from the *SharePoint admin center*. ### Examples Here, a little example to illustrate the usage: 1. If you wish to **CREATE** a SharePoint list, the URL you will use is `https://graph.microsoft.com/v1.0/sites/00000000-0000-0000-0000-000000000000/lists` with the `POST` method and the body message in accordance with what SharePoint expects 2. If you wish to **READ** the SharePoint list, the URL you will use is `https://graph.microsoft.com/v1.0/sites/00000000-0000-0000-0000-000000000000/lists/00000000-0000-0000-0000-000000000000` with the method `GET`. This request returns the list properties and not the content of it. If you wish to retrieve the content, just add `items` at the end of the URL 3. If you wish to **UPDATE** the SharePoint list... I am not sure you can (yet) 4. If you wish to **DELETE** the SharePoint list, the URL you will use is `https://graph.microsoft.com/v1.0/sites/00000000-0000-0000-0000-000000000000/lists/00000000-0000-0000-0000-000000000000` with the method `POST` and the header `X-HTTP-Method` with the value at `DELETE` ### Links Microsoft documentation about Microsoft Graph with SharePoint: [Working with SharePoint sites in Microsoft Graph - Microsoft Graph v1.0The SharePoint API in Microsoft Graph supports the following core scenarios:Microsoft Docsrgregg![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://docs.microsoft.com/en-us/graph/api/resources/sharepoint?view=graph-rest-1.0&ref=blog.lsonline.fr) Microsoft provides Graph Explorer; a tool to connect you to your environment, try your own requests or some samples: [Graph Explorer - Microsoft GraphThe Microsoft Graph explorer is a tool that lets you make requests and see responses against the Microsoft Graph![](https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE1Mu3b?ver=5c31)Microsoft GraphO365devxmicrosoft.com](https://developer.microsoft.com/en-us/graph/graph-explorer?ref=blog.lsonline.fr) ## Conclusion Microsoft Graph is young and has less documentation than SharePoint REST API; for the developers, the research and development could be a little bit longer. Because Microsoft Graph is relatively young, the endpoints are limited. Currently (*October 2, 2019*), the endpoints available to work with SharePoint are: - Access to SharePoint **sites**, **lists**, and **drives** (document libraries) - Read-only support for **site** resources (no ability to create new sites) - Read-write support for **lists**, **listItems**, and **driveItems** - Address resources by SharePoint ID, URL, or relative path Microsoft Graph is "more secure" than SharePoint REST API because the resources accesses are explicit into the code and approved by a SharePoint administrator and/or the users. SharePoint REST API is essentially based on the SharePoint user context whereas Microsoft Graph is based on the entire environment. Microsoft Graph can be more greedy than SharePoint REST API for little or a lot of actions on a SharePoint context only -> it is bringing in an elephant to kill a mouse, isn't it? Microsoft Graph becomes useful when you wish to link several resources types in one point (like Delve does). I hope this post has clarified some aspects in order for you to choose the best solution by yourself. Hoping this post will help you ? ### The tools for a SharePoint developer - Part 1 URL: https://blog.lsonline.fr/2019/09/10/the-tools-for-a-sharepoint-developer-part-1/ Last updated: 2026-01-27T18:53:02.000Z I have the occasion to integrate some teams of developers through my different customer projects and jobs; often some of my teammates asked me: - What are the basic tools that we have to use to begin well with the SharePoint developments? - What tools I should have to use to do...? - I am not familiar with this way of working, how can I do it? Based on my own experience, I am sharing with you the tools in a "basic environment" of a SharePoint developer to work in the best conditions. In addition, because I am often working on two operating systems (Mac OS and Windows in this order ?), I often look to find solution cross-platforms. ## #1 A SharePoint environment ![What a developer need to ...](https://blog.lsonline.fr/content/images/2019/09/WordItOut-word-cloud-3898283-1.png) What a developer needs to ... This is why I am convinced each developer should have **his own development environment,** like this they can: - configuration what they want - broke them environment - delete what they want - etc. without interrupting or disturb other developers. On an On-Premise environment, it was almost a prerequisite, but it was quite complex because it was necessary to install a virtual machine or worse, his own computer with a SharePoint installation ? (between us, a lot of developers do not know and do not care about how to install SharePoint Server, they just want to develop even if some basics are essential!). In an Online environment almost nothing changes, I would say it is more simple and really less expensive if we are talking about SharePoint development only, of course, because a development environment is free and can be created by everyone who wants one. Here a little schema of a process/architecture that I suggest generally implement to my customers and teammates: ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-SPDevProcessEnv-1.jpg) An advanced architecture of development until production > \[note\]**Note** > > Prerequisites Azure DevOps or other repository + CI/CD. ## #2 Virtual environments Some organizations provide a laptop, desktop, and virtual machines to work, and some other organizations not (bring your own device)... In both cases, this is the same problem: What are you doing if you: - have to rollback your environment - wish to share your environment with another developer - broke your environment - have different projects/customers with different environments and program versions - laptop does not work on Windows (Mac OS X, Linux, etc.) - etc. Virtual environments allow you to avoid this kind of problem. Of course, if you want to work with virtual environments, you need a computer with sufficient configuration: - 16 GB of RAM or more - 500 GB of space disk or more - 4 cores of virtual processors or more - a laptop-compatible with the virtualization - licenses... > \[note\]**Note** > > They are a long time ago, I was running SharePoint 2010 with a computer with 8 GB of RAM and 256 GB of disk (no SSD) and 2 cores. One other reason why I like virtual machines is because of the tests! Yes, how do you try some other browsers and platforms? If you have a Mac OS X (for example), you can test Safari and through your virtual machines, you can test Internet Explorer, Edge, Firefox, and several versions of Windows or Linux (because the Windows versions can influence the behavior of your solution). If someone asks himself "Yes, but set up all of these environments just for tests it is a little bit too much"... Yes you are right! This is why Microsoft provides for the developers' several environments for the test (Thank you Microsoft ❀️) [Free Virtual Machines from IE8 to MS Edge - Microsoft Edge DevelopmentDownload free virtual machines to test Microsoft Edge and IE8 to IE11![](https://az813057.vo.msecnd.net/images/apple-touch-icon.b3e6e82.png)Microsoft Edge Development](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/?ref=blog.lsonline.fr) What you have to install to virtualize your environment(s)? Here some solutions I am using: - **[VirtualBox](https://www.virtualbox.org/?ref=blog.lsonline.fr)**: for personal usage and because it is cross-platform - **[VMware](https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html?ref=blog.lsonline.fr)**: the free version of VMware Player can be sufficient for testing, but for the developments, this solution can be quickly not sufficient - [**Hyper-V**](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v?ref=blog.lsonline.fr): the must if you are working on Windows (available for free until Windows 8 ?) - [**Parallels**](https://www.parallels.com/?ref=blog.lsonline.fr): only on Mac OS X and not free if you want to virtualize Windows environments ## #3 Execute command lines The most powerful of developers and "administrators" is the command lines knowledge to manage the environments! Why? ### Features accessibility Because all features that allow an administrator to manage his Microsoft 365 environment are not all available from the UI. Some examples? - Add an App Catalog to a SharePoint site collection - Create and add custom Site Script and Site Design - Create public or private additional CDN - Swap two site collections - and some others... > \[note\]**Note** > > You will can find the list of cmdlets in the official documentation [here](https://docs.microsoft.com/en-us/powershell/module/sharepoint-online/?view=sharepoint-ps&ref=blog.lsonline.fr). ### Several executions Sometimes, you have to perform several time-consuming tasks: - Create users - Assign licenses - Create SharePoint site collections - Perform configurations - etc. You can do them manually or you can create scripts that can do this for you. With this kind of approach you: - win a lot of time to do something else - avoid human errors - keep a homogeneity (user license templates, configuration, etc.) - ... ### Automation Another reason to use scripts is to automate the recursive tasks. You can execute the scripts via a trigger or schedule them. As a developer, you wish to automate: - code coverage - build the solution(s) - deploy the solution(s) to specific environments (dev, stage, prod, etc.) - ... As an administrator, you wish to automate: - create of Microsoft objects (SharePoint site collections, AAD users, etc.) - manage security (audit, apply security configuration, etc.) - backups - ... ### Prerequisites To execute commands, you will need at least one of these tools: - [SharePoint Online PowerShell](https://docs.microsoft.com/en-us/powershell/module/sharepoint-online/?view=sharepoint-ps&ref=blog.lsonline.fr): PowerShell module provided directly by Microsoft that allows you to manage your SharePoint environment - [SharePoint PnP PowerShell](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/?view=sharepoint-ps&ref=blog.lsonline.fr): PowerShell module provided by the Pattern & Practices Community (PnP) managed by awesome Microsoft peoples that give their personal time to help the developers and administrators (thank you guys, you are the best ❀️) - [Office365-CLI](https://pnp.github.io/office365-cli/?ref=blog.lsonline.fr): *NPM* package provided partially by the Pattern & Practices Community too, but mainly managed by [Waldek](https://blog.mastykarz.nl/?ref=blog.lsonline.fr) (thank you ❀️) - [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/?view=azure-cli-latest&ref=blog.lsonline.fr): a cross-platform solution provided directly by Microsoft that allows you to manage your Azure resources --- ## What's next In the [next part](https://blog.lsonline.fr/2020/12/03/the-tools-for-a-sharepoint-developer-part-2/), I will tell you more about useful applications I am using and how they will allow you to code easier, test your code and save you time. Hoping this post will help you ? ### How to get your Microsoft 365 Tenant ID URL: https://blog.lsonline.fr/2019/09/02/how-to-get-your-microsoft-365-tenant-id/ Last updated: 2026-01-27T18:53:02.000Z > Update 2019-09-09: Add SharePoint REST API What is a Tenant ID? When you subscribe to Microsoft 365, Microsoft provides you a full environment with several services (SharePoint, Teams, Azure Active Directory, etc.). In order to link all of these services between them and on your environment, they use a unique identifier which is your Tenant ID. The Tenant ID is represented as GUID: `00000000-0000-0000-0000-000000000000` Generally, you do not need to know your Tenant ID but sometimes, essentially for the developers or when your company needs to deploy an app (ex: enable PowerBI **Microsoft 365 Usage Analytics*)*, you need to. How to retrieve your Tenant ID? Here, some ways to find it! ## Azure Active Directory By default, all the users of your company have access to the [Azure Portal](https://portal.azure.com/?ref=blog.lsonline.fr). Once you are connected to your [https://portal.azure.com](https://portal.azure.com/?ref=blog.lsonline.fr), click on `Azure Active Directory`, then `Properties` and this is the Directory ID ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-AAD.jpg) Get Microsoft 365 Tenant ID from Azure portal ## Microsoft 365 Admin Center > \[note\]**Note** > > For the users accounts with at least the Reports reader role Once you are connected to your [https://admin.microsoft.com](https://admin.microsoft.com/?ref=blog.lsonline.fr), expand `Reports` from the left navigation and click on `Usage`. At the bottom of the page, you should find the **Microsoft 365 usage analytics** with your Tenant ID. ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-M365AdminCenter-1.jpg) Get Microsoft 365 Tenant ID from Microsoft 365 Admin Center ## SharePoint Admin Center (App permissions) > \[note\]**Note** > > For SharePoint administrators only Once you are connected to your SharePoint Admin Center (`https://yourdomain-admin.sharepoint.com`), click on `Classic features` from the left navigation, then click on `Open` under ***Apps*** section and click on `App Permissions` (last link). On this page, you will see some Apps with a unique identifiers. Each identifier contains a claim with an ID followed by an *at ("@")* and your Tenant ID (ex: *i:0i.t|ms.sp.ext|00000000-0000-0000-0000-000000000000@YOURTENANTID*) ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-SPADMCenter.jpg) ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-FromSPAppPermissions.jpg) Get Microsoft 365 Tenant ID from SharePoint Admin Center ## SharePoint site It is a little bit more complex to find the Tenant ID from a SharePoint site but you can do it too. ### Web Inspector Open any modern SharePoint site (or classic) and open the *Web Inspector / Web Developer Console* - On **Windows**, it is generally ***F12*** - On **MAC OS X**, it is generally ***CMD + OPTION + i*** Once opened, launch a search on "**siteSubscriptionId**" - On **Windows**: ***CTRL + F*** - On **MAC OS X**: ***CMD + F*** ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-FromSPSite.jpg) Get Microsoft 365 Tenant ID from SharePoint site ### Rest API URL Firstly, open your favorite web browser and go to any SharePoint site collection then, edit the URL like this: ```plaintext https://contoso.sharepoint.com/sites/mysite/_api/SP.UserProfiles.PeopleManager/GetMyProperties ``` > \[note\]**Note** > > Replace `contoso` by your own domain name. the result will be a little bit huge... But perform a search on "**SPS-DistinguishedName**": ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-SPRestApi.jpg) Get Microsoft 365 Tenant ID from SharePoint REST API here an example of the value (the first `OU` correspond to your Tenant ID): ```Plaintext CN=00000000-1111-2222-3333-444444444444,OU=[YOUR TENANT ID],OU=Tenants,OU=MSOnline,DC=SPODS0123456789,DC=msoprd,DC=msft,DC=net ``` ## Teams All the users who have a *Microsoft Teams* license can reach their [https://portal.office.com](https://portal.office.com/?ref=blog.lsonline.fr) and click on the *Teams* *tile or access it directly from their Desktop application.* Once connected to the application (web or desktop), you can show your Tenant ID by sharing: - Team - Channel Click on the ellipsis on the right of Team or Channel and click on `Get a link ...`; at the end of the URL, you will see your Tenant ID. ![](https://blog.lsonline.fr/content/images/2019/09/Screen-Shot-2019-09-04-at-12.24.18.png) ![](https://blog.lsonline.fr/content/images/2019/09/Screen-Shot-2019-09-04-at-12.24.33.png) ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-MSTeamLinkTeam.jpg) ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-MSTeamLinkChannel.jpg) Get Microsoft 365 Tenant ID from Microsoft Teams Team and Channel ## PowerApps All the users who have a PowerApps license can reach their [https://portal.office.com](https://portal.office.com/?ref=blog.lsonline.fr) and click on the *PowerApps* *tile*. Once redirected to the **PowerApps home page**, the Tenant ID is visible from the URL. ![](https://blog.lsonline.fr/content/images/2019/09/Screen-Shot-2019-09-04-at-11.33.11.png) ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-FromPowerApps.jpg) Get Microsoft 365 Tenant ID from PowerApps ## Flow All the users who have a *Microsoft Flow* license can reach their [https://portal.office.com](https://portal.office.com/?ref=blog.lsonline.fr) and click on the *Flow* *tile*. Once redirected to the **Microsoft Flow home page**, click on `My Flows` from the left navigation, and the Tenant ID is visible from the URL. ![](https://blog.lsonline.fr/content/images/2019/09/Screen-Shot-2019-09-04-at-19.05.07.png) ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-FromFlow.jpg) Get Microsoft 365 Tenant ID from Microsoft Flow ## Stream > \[note\]**Note** > > For Stream administrators only All the users who have a *Microsoft Stream* license, can reach their [https://portal.office.com](https://portal.office.com/?ref=blog.lsonline.fr) and click on the *Stream* *tile or directly from the URL* [*https://web.microsoftstream.com/*](https://web.microsoftstream.com/?ref=blog.lsonline.fr). Once redirected to the **Microsoft Stream home page**, click on **Settings** (gear) from *Microsoft 365 top bar* then, click on `Admin settings` link. From the left navigation, expand `Manage Stream` and click on `eCDN provider`. ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-Stream.jpg) Get Microsoft 365 Tenant ID from Microsoft Stream --- ## Office365-CLI Once `[logged](https://pnp.github.io/office365-cli/cmd/login/?ref=blog.lsonline.fr)` to your environment, the following command will return your Tenant ID: ```bash tenant id get --domainName mydomain.onmicrosoft.com ``` and the result is: ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-Office365-CLI-2.jpg) Get Microsoft 365 Tenant ID with Office365-CLI ## Azure CLI The only thing you have to do is to connect into your environment with the following command: ```PowerShell az login ``` once connected, the result is: ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-AzureCLI.jpg) Get Microsoft 365 Tenant ID with Azure CLI ## Azure Active Directory PowerShell The only thing you have to do is to connect into your environment with the following cmdlet: ```PowerShell $AzCreds = Get-Credential Connect-AzureAD -Credential $AzCreds ``` and the result is: ![](https://blog.lsonline.fr/content/images/2019/09/LsOnline-GetTenantID-FromAzPowerShell.jpg) Get Microsoft 365 Tenant ID with Azure Active Directory PowerShell module ## SPFx For the developers who need to use the Tenant ID in their SharePoint Framework components, you will find it like that: ```JavaScript this.context.pageContext.aadInfo.tenantId._guid ``` Hoping this post will help you ? ### Setup Matomo Tag Manager to the classic SharePoint site collections URL: https://blog.lsonline.fr/2019/08/03/setup-matomo-tag-manager-to-the-classic-sharepoint-site-collections/ Last updated: 2026-01-27T18:52:55.000Z If you have already read the post about [Setup Matomo Analytics to the classic SharePoint site collections](https://blog.lsonline.fr/2019/07/29/setup-matomo-analytics-to-the-classic-sharepoint-site-collections), you are maybe interested to go ahead with more capabilities. What is the difference between a **Tag Management System** and an **Analytics Tracker**? - **Analytics**: generates reports and statistics based on the visits and visitors. It is possible to add some *custom variables* or *custom dimensions* to obtain further information; to add this kind of thing, **you will need a minimum of development skills** because you will need to add scripts into SharePoint. Example: add a JavaScript script (via Custom Action of course in addition to the Analytics script) to catch a specific click and perform a push to record it. [More information β€Ί](https://developer.matomo.org/guides/tracking-javascript-guide?ref=blog.lsonline.fr#custom-variables-for-visits) - **Tag Manager**: This allows you to create and trigger some custom tags in accordance with your business needs in addition to track page views and all information about the visits and the visitors. Furthermore, tags and triggers management can be done without additional developments in your environment; the global configuration is pushed from the Tag Management System into the target environment once published. [More information β€Ί](https://matomo.org/docs/tag-manager/?ref=blog.lsonline.fr#what-is-a-tag-manager) ## **Setup Matomo Tag Manager** I wrote a script that will allow you to easily implement the Tag Manager script into your SharePoint sites based on classic Templates. ### **Prerequisites** 1. A Matomo (Piwik) server (On-Premises) or instance (Online) 2. A Matomo ****Tag Manager URL**: [https://matomo.org/docs/tag-manager/#how-can-i-set-up-matomo-tag-manager-on-my-website](https://matomo.org/docs/tag-manager/?ref=blog.lsonline.fr#how-can-i-set-up-matomo-tag-manager-on-my-website) 3. You will need to install the [****PnP PowerShell module**](https://github.com/SharePoint/PnP-PowerShell/releases?ref=blog.lsonline.fr) *(I did not create the bash script yet ??)* ### PowerShell 1. Download the **solution** from the [repository](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/tree/master/SharePoint.MTM?ref=blog.lsonline.fr) 2. Unzip the archive 3. Execute the following cmdlet by changing `container_[ID]` with your Matomo URL: ```PowerShell .\SPMTM.ps1 -siteUrl "https://intranet.mydomain.com/sites/targetSite" -trackingUrl https://matomo.my-domain.com/js/container_[ID].js ``` **If you cannot execute the PowerShell script, because of security reasons, before unzipping the package, execute the* `[**Unblock-File*](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unblock-file?view=powershell-6&ref=blog.lsonline.fr)` *cmdlet.* > \[note\]****Note** > > Other options are available as illustrated into the [README.md](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/blob/master/SharePoint.MTM/README.md?ref=blog.lsonline.fr), that allow you to manage the deployment > \[note\]****Note** > > The user account that will perform the following actions has to have sufficient permissions on the target sites collection. Hoping this post will help you ? ### Setup Matomo Analytics to the classic SharePoint site collections URL: https://blog.lsonline.fr/2019/07/29/setup-matomo-analytics-to-the-classic-sharepoint-site-collections/ Last updated: 2026-01-27T18:56:54.000Z If you already saw the post about [*setup matomo analytics to Modern SharePoint from any platform*](https://blog.lsonline.fr/2019/05/11/setup-matomo-analytics-to-modern-sharepoint-from-any-platform) but you are still using the classic experience of SharePoint, the SPFx solution cannot be used. How to implement Matomo Analytics in this case? To do this, you can: 1. Follow the tutorial provided by the official website of *Matomo* that consists to **edit Master Page**: [https://matomo.org/faq/how-to-install/faq\_34763/](https://matomo.org/faq/how-to-install/faq%5F34763/?ref=blog.lsonline.fr). Honestly, I don't recommend this solution for several reasons: - Microsoft can push some updates and because you already have edited the master page, you can block these updates and won't benefit from new features - Any update of SharePoint released by Microsoft can break your modifications - It is risky! If you break Master Page, your final users can not reach any page of the SharePoint site anymore (advice: edit only the site Master page and not the System one. That allows your administrators to keep access to the back office but there will be no analytics available for this kind of pages) - Any update needs to deploy/edit each concerned Master Page - Edit Master Page is not a Best Practice and not available with the Modern UI anymore 2. Create custom **page layouts** - You have to edit all native page layouts or remove them - Create as many page layouts as your final users need - Update all your page layouts on all of your SharePoint sites is a really tricky situation 3. Add **Content Editor or Script Editor** on each page - Don't forget to add it to each page - No web part on the back office pages - Users can easily remove it - Complicated for your final users and for the maintenance 4. Use *this solution* based on SharePoint **Custom Actions** - You do not touch on native elements - Implement into your Template, by PowerShell or bash. Users can't change or bypass the script without sufficient rights and knowledge - You have to have a script to update massively the Custom Action. You can do it without disturbing your final users - Approximately the same behavior that the SPFx extension - You can add, remove, update, disable and enable several or only one site collections ## Setup Matomo Analytics I wrote a script that will allow you to easily implement the Analytics tracker script into your SharePoint sites. ### Prerequisites 1. A Matomo (Piwik) server (On-Premises) or instance (Online) 2. A Matomo Analytics **Tracking Site ID**: [https://developer.matomo.org/guides/tracking-javascript-guide#finding-the-piwik-tracking-code](https://developer.matomo.org/guides/tracking-javascript-guide?ref=blog.lsonline.fr#finding-the-piwik-tracking-code) 3. You will need to install the [**PnP PowerShell module**](https://github.com/SharePoint/PnP-PowerShell/releases?ref=blog.lsonline.fr) *(I did not create the bash script yet πŸ™„)* ### PowerShell 1. Download the **solution** from the [repository](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/tree/master/SharePoint.MA?ref=blog.lsonline.fr) 2. Unzip the archive 3. From your *PowerShell terminal*, launch the `SPMA.ps1` and indicate the credentials to the Windows prompt ```powershell .\SPMA.ps1 -siteUrl "https://intranet.mydomain.com/sites/targetSite" -trackingUrl https://matomo.my-domain.com -trackingSiteId "1" ``` *If you cannot execute the PowerShell script, because of security reasons, before unzipping the package, execute the* [*Unblock-File*](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unblock-file?view=powershell-6&ref=blog.lsonline.fr) *cmdlet.* > \[note\]**Note** > > Other options are available as illustrated into the [README.md](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/blob/master/SharePoint.MA/README.md?ref=blog.lsonline.fr), that allow you to manage the deployment > \[note\]**Note** > > The user account that will perform the following actions has to have sufficient permissions on the target sites collection. Hoping this post will help you πŸš€ ### Display a warning on your SharePoint sites that allow external sharing URL: https://blog.lsonline.fr/2019/07/17/display-a-warning-on-your-sharepoint-sites-that-allow-external-sharing/ Last updated: 2026-01-27T18:56:17.000Z I often hear some of my customers say: "How can I know if this site collection allows external sharing?" Natively, to ensure that the SharePoint site allows you to share data with external users, try to share something with an external user. If the following error message appears, that means that your SharePoint site does not allow external sharing: ![](https://blog.lsonline.fr/content/images/2019/07/Screen-Shot-2019-07-16-at-18.57.47.png) ![](https://blog.lsonline.fr/content/images/2019/07/Screen-Shot-2019-07-16-at-18.58.36.png) SharePoint that does not allow external sharing error message If external sharing is enabled, how to warn the users that the SharePoint site allows external sharing and provides a link to the governance of your organization? As far as I know, no solution exists πŸ˜•. I suggest you develop a little extension that allows you to do all of the previous cases... First, create a new [SharePoint Framework](https://docs.microsoft.com/en-us/sharepoint/dev/spfx/sharepoint-framework-overview?ref=blog.lsonline.fr) extension: ```bash yo @microsoft/sharepoint ``` ### Check if the SharePoint site allows external sharing Now, how to know if your SharePoint site allows external sharing? Thanks to the context: ```JavaScript this.context.pageContext.legacyPageContext.guestsEnabled ``` ### Support Tenant-scoped solution deployment To deploy the solution on all SharePoint sites collections on your Tenant, ensure that `skipFeatureDeployment` attribute in the `package-solution.json` is at `true` ```JSON "skipFeatureDeployment": true, ``` ### Manage SharePoint placeholders Now, it should be easy to develop your extension with this information in mind. Your `onInit()` function should be like: ```TypeScript @override public onInit(): Promise { this.context.placeholderProvider.changedEvent.add(this, this._renderPlaceHolders); return Promise.resolve(); } ``` and here, a sample of the `_renderPlaceHolders()`: ```TypeScript private _renderPlaceHolders(): void { /* * This is the most important condition. If false, nothing append */ if (this.context.pageContext.legacyPageContext.guestsEnabled) { if (!this._topPlaceholder) { this._topPlaceholder = this.context.placeholderProvider.tryCreateContent( PlaceholderName.Top, { onDispose: this._onDispose } ); // The extension should not assume that the expected placeholder is available. if (!this._topPlaceholder) { console.error("The expected placeholder (Top) was not found."); return; } if (this.properties) { /* * Display the warning message */ if (this._topPlaceholder.domElement) { this._topPlaceholder.domElement.innerHTML = `
${strings.msg}
`; } } } } } ``` ### Add a little display style To provide a multilingual message, you can use localization files and manage the style, here a sample of CSS: ```CSS @import '~@microsoft/sp-office-ui-fabric-core/dist/sass/SPFabricCore.scss'; .ruban { width: 100%; text-align: center; display: flex; align-items: center; background-color: #FFCC00; .msg { color: $ms-color-black; text-align: center; margin: auto; line-height: 2.5; } } ``` ### Build and deploy the solution Build your package by performing the following command lines: ```bash gulp bundle --ship gulp package-solution --ship ``` Once the build is done, get the `.sppkg` file from the folder **sharepoint/solution** and perform drag & drop of it to your *Tenant App Catalog*: ![](https://blog.lsonline.fr/content/images/2019/07/LsOnline-DragAndDrop-WarnExternalSharingSoluti-AppCatalog.jpg) ![](https://blog.lsonline.fr/content/images/2019/07/LsOnline-OrgWide-WarnExternalSharing-Deploy.jpeg) Deploy SharePoint package solution to App Catalog Browse on a SharePoint site that allows the external sharing to see the result: ![](https://blog.lsonline.fr/content/images/2019/07/Screen-Shot-2019-07-16-at-19.36.10.png) Result of warning message for SharePoint that allow external sharing Hoping this post will help you πŸš€ ### Restore inheritance after sharing or copying a link OneDrive/SharePoint Online URL: https://blog.lsonline.fr/2019/05/29/restore-inheritance-after-sharing-or-copying-a-link-onedrive-sharepoint-online/ Last updated: 2026-01-27T18:53:26.000Z With the modern experience of SharePoint Online and OneDrive, a lot of user experience improvements were made. Into these improvements, the simplification of some actions has some side effects that the final users and administrators don't want or don't know, more particularly with the **sharing links**. Often, I am seeing during an audit for my customers or hearing when one of them ask me why some peoples have access of somethings whereas they should not behave access? How can I revoke grant access? I don't need to explain to you how to share or get a link to file on SharePoint Online or OneDrive because some other great posts explain that: [Copy Link in Modern SharePoint – non-obvious security implications you should know aboutRecently I encountered a strange issue in a client’s Intranet during the content buildout phase. They’d given read-only access to a group of pilot users, and loaded up their site with p…![](https://s1.wp.com/i/favicon.ico)derekgusoffderek gusoff![](https://derekgusoff.files.wordpress.com/2018/08/copylink2.png)](https://derekgusoff.wordpress.com/2018/08/14/copy-link-in-modern-sharepoint-non-obvious-security-implications-you-should-know-about/?ref=blog.lsonline.fr) [Share and Copy Link Breaks Document Permissions in SharePointSharePoint has a robust and fine-grained security mechanism for content which allows documents to inherit permissions from the library they are in and also to have unique permissions assigned. Assigning individual permission to documents involves breaking the inheritance structure and is normally do![](https://static-exp1.licdn.com/scds/common/u/images/logos/favicons/v1/favicon.ico)Milan Gross![](https://media.licdn.com/dms/image/C5112AQGXy0XrYAfGQQ/article-cover_image-shrink_600_2000/0?e=1572480000&v=beta&t=XyZl4uP-2ld8cJKQH8n0l2Zs-1jdbi0HDk5UtPSA8tk)](https://www.linkedin.com/pulse/share-copy-link-breaks-document-permissions-sharepoint-milan-gross/?ref=blog.lsonline.fr) The thing that you have to know is once you have shared something, this permissions inheritance is broken. Even if you click on ***Stop Sharing***, the permissions inheritances are not restored. > \[note\]**Note** > > Stop sharing remove all access except for owners (the access for members, visitors, etc. are removed). ![](https://blog.lsonline.fr/content/images/2019/05/Screen-Shot-2019-05-29-at-12.06.56.png) SharePoint stop sharing the link ## Permissions inheritance The permissions inheritance, it is a means that to propagate the user's permissions from the parents to the children (that can be a simple definition). On SharePoint, you can manage independently the permissions for: - Sites Collection / Root web - Web (subsites) - List/Library - Folder - File/Item *By default, all "artifacts" of SharePoint inherit the permissions from his parent (excepted the Sites Collections that are the "root" level, so no parent).* The modern experience does not provide an interface to manage the permissions inheritance yet and to access it, it depends on artifact: - **Sites Collection/Web**: click on the *gear* from the Office 365 Ruban > Site Permissions > Advanced permissions settings (at the bottom of the panel) ![LsOnline-SPWeb-Modern-AdvancedPerms-01](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPWeb-Modern-AdvancedPerms-01.jpg) ![LsOnline-SPWeb-Modern-AdvancedPerms-02](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPWeb-Modern-AdvancedPerms-02.jpg) - **List/Library**: - From the Site Contents, click on the *ellipsis* of the target list/library > Settings > from the area *Permissions and Management*, click on **Permissions for this document library** *(permissions of this list in the case of SharePoint list settings)* ![LsOnline-SharingList-EllipsisAccessToAdvanceSettings-1](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SharingList-EllipsisAccessToAdvanceSettings-1.jpg) - From the Site Contents, open/click on the target list/library > click on the *gear* from the Office 365 Ruban > Library settings > from the area *Permissions and Management*, click on **Permissions for this document library** *(permissions of this document library in the case of SharePoint document library settings)* ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPListSettings-Permissions.jpg) Access to the advanced permissions of a document of SharePoint library - **Folder/File/Item**: click on the item, file, or targeted folder and from the details pane > click on Manage access > at the bottom of the next panel, click on Advanced ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SharingItem-InfoManageAccess.jpg) ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SharingItem-InfoAdvancedManageAccess.jpg) Path to access at the advanced access management for an item of SharePoint ### Restore the inheritance Once you are on the manage permissions inheritance interface, you can see from the *SharePoint Ruban,* into the section Inheritance, the following action: - When the inheritance did not break: ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPRuban-InheritPermissions-1.jpg) SharePoint Ruban actions when the artifact inherit the permissions of the parent - When the inheritance was broken, you can **delete unique permissions** to restore the inheritance: ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPRuban-UniquePermissions.jpg) SharePoint Ruban actions when the artifact has unique permissions Hoping this post will help you πŸš€ ### Setup Matomo Analytics to Modern SharePoint from any platform URL: https://blog.lsonline.fr/2019/05/11/setup-matomo-analytics-to-modern-sharepoint-from-any-platform/ Last updated: 2026-01-27T18:52:09.000Z > Update 2019-09-17: update links of Matomo solution *This is an alternative to one of my previous posts about* [*Setup Google Analytics to Modern SharePoint from any platform*](https://blog.lsonline.fr/2019/02/07/setup-google-analytics-to-modern-sharepoint-from-any-platform/)*. Google Analytics* means that your organization has to host data about software and users into a tierce solution. For some governance, privacy, and security reasons, some organizations can not use this kind of solution.β€Œβ€Œ So, what are the alternatives? Is there another free solution? ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-NoGoogleAnalytics-Logo-3.png) No Google Analytics I have done some research for a while ... I found other interesting analytics tools that I tried on my own blog and SharePoint test environments. Two solutions caught my attention based on the following criteria: 1. **Free**: totally free is a must but at least basic features for free 2. **Open-Source**: I like open-source solutions so much! That gives the organization enough flexibilities to improve and customize the solution for their needs. And, incidentally, contribute to this project. 3. **Self-Hosted**: of course, if you want to keep a hand on the data, the best solution is self-hosting. Thanks to this kind of solution, you can potentially have a compliant [GDPR](https://gdpr-info.eu/?ref=blog.lsonline.fr) solution too. 4. **Google Analytics alternative**: is currently a reference in the world of web analytics services. Therefore, I took it as a reference to find solutions that provide sufficient similar features such as real-time, several graphs, create custom dashboards, maps, etc. 5. **Relatively easy to implement**: if you are to present an awesome solution to your customer but he has to spend half of his time and budget to set up the solution itself... hmm, you know what I mean, isn't it? πŸ€“ ## Open Web Analytics ![](https://blog.lsonline.fr/content/images/2019/05/owa_logo_200w.png) [Open Web Analytics logo](http://www.openwebanalytics.com/?ref=blog.lsonline.fr) I tested OWA at first because of several features available for free such as heatmap, mouse click, etc. After several weeks, I noted that the admin interface was really old, some features did not really work (for my part, I did not manage to make it work "heatmap" for example) and the real-time was missing. In addition, I am following the [GitHub repository](https://github.com/padams/Open-Web-Analytics?ref=blog.lsonline.fr) of the solution and I did not see any new fixing issue, enhancement, or whatever for a long time... > \[note\]**Note** > > For my tests, I used the [https://github.com/vladk1m0/docker-owa docker](https://github.com/vladk1m0/docker-owa%20docker?ref=blog.lsonline.fr) image. So, I decided to pass to the next analytics tool... ## Matomo (Piwik) ![](https://blog.lsonline.fr/content/images/2021/01/matomo-logo-certificate-3.jpg) [Matomo Analytics logo](https://matomo.org/?ref=blog.lsonline.fr) Matomo is the solution that I am currently using for some weeks; this solution looks a lot like *Google Analytics*: - Dashboard configuration - Tracker code implementation - Features (available for free) In addition to that, Matomo: - is GDPR compliance - is customizable (Open-Source) - has a Marketplace of features Moreover, I did a suggestion for a new dashboard widget on the [GitHub repository](https://github.com/matomo-org/matomo?ref=blog.lsonline.fr) anda member of the team answered me the same day! Efficiency. Now, I will show you how I have configured my environment... ## Matomo for Modern SharePoint - for everybody You can have *Matomo Analytics* in two ways: - Cloud Hosting (the providing is not free. A grid of pricing is available [here](https://matomo.org/pricing/?ref=blog.lsonline.fr)) - Self-Hosted with installation (free - some technical knowledge are required) > \[note\]**Note** > > See [On-Premise/Cloud hosting comparison table](https://matomo.org/what-is-on-premise/?ref=blog.lsonline.fr) for more information ### Set up Docker Matomo server Since I do not have several servers on hand, I am using Docker containers to have several services, including Matomo that provides a Docker Image that can be quickly configured and implemented into your environment. Below, my local Docker composes file that I use for my tests: ```docker version: '3.7' services: mysql: image: mysql:5.7.25 environment: - MYSQL_ROOT_PASSWORD=password01 restart: always phpmyadmin: image: phpmyadmin/phpmyadmin:latest depends_on: - mysql ports: - "9010:80" - "9011:443" environment: - PMA_HOST=mysql restart: always matomo: image: bitnami/matomo:latest depends_on: - mysql ports: - "9020:80" - "9021:443" environment: - MARIADB_HOST=mysql - MARIADB_ROOT_PASSWORD=password01 - MYSQL_CLIENT_CREATE_DATABASE_NAME=matomo - MYSQL_CLIENT_CREATE_DATABASE_USER=matomo - MYSQL_CLIENT_CREATE_DATABASE_PASSWORD=password01 - MATOMO_DATABASE_NAME=matomo - MATOMO_DATABASE_USER=matomo - MATOMO_DATABASE_PASSWORD=password01 - MATOMO_USERNAME=matomo - MATOMO_HOST=matomo - MATOMO_PASSWORD=password01 - MATOMO_EMAIL=matomo@localhost.fr restart: always networks: default: ``` ### Set up Matomo client (SharePoint Framework extension) I wrote two scripts that will allow you to easily implement the solutionπŸ’‘ #### Prerequisites 1. Matomo Analytics **Tracking Site ID** 2. Tenant App Catalog or Site Collection App Catalog: - Configure your Tenant App Catalog: [https://docs.microsoft.com/en-us/sharepoint/use-app-catalog](https://docs.microsoft.com/en-us/sharepoint/use-app-catalog?ref=blog.lsonline.fr) - Configure your Site Collection App Catalog *(optional)*: [https://docs.microsoft.com/en-us/sharepoint/dev/general-development/site-collection-app-catalog](https://docs.microsoft.com/en-us/sharepoint/dev/general-development/site-collection-app-catalog?ref=blog.lsonline.fr) 3. If you choose to use the **PowerShell** solution, you will need to install the **[PnP PowerShell module](https://github.com/SharePoint/PnP-PowerShell/releases?ref=blog.lsonline.fr)** 4. If you choose to use **any platform** solution, you will need **Bash** and **[Office365-CLI](https://pnp.github.io/office365-cli?ref=blog.lsonline.fr)** > \[note\]**Note** > > The user account that will perform the following actions has to have sufficient permissions on the target sites collection and on the App Catalog. #### PowerShell (Windows only) 1. Download the **PowerShell solution** from the [repository](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/matomo/-/releases?ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-Matomo-ps-release-1.jpg) PowerShell script release 1. Unzip the package 2. From your *PowerShell terminal*, connect to your target site collection with [Connect-PnPOnline](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/connect-pnponline?ref=blog.lsonline.fr) cmdlet ```powershell Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/target-site ``` 1. Launch the `setup.ps1` ```powershell .\setup.ps1 -siteUrl https://contoso.sharepoint.com/sites/target-site -trackingUrl https://matomo.my-domain.com -trackingSiteId '2' ``` > \[note\]Note > > If you cannot execute the PowerShell script, because of security reasons, before unzipping the package, execute the [Unblock-File](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unblock-file?view=powershell-6&ref=blog.lsonline.fr) cmdlet. > \[note\]**Note** > > In this example, the package is deployed to the Site Collection App Catalog. You have other options illustrated into the [README.md](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/matomo/blob/master/README.md?ref=blog.lsonline.fr), that allow you to manage the deployment. #### Any platform (Linux, Mac OS, Windows) 1. Download **any platform** solution from the [repository](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/matomo/-/releases?ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-Matomo-bash-release-1.jpg) Bash script release 1. Unzip the package 2. Allow `setup.sh` script execution ```bash chmod +x ./setup.sh ``` 1. From your *Bash terminal*, connect to your target site collection with [spo login](https://pnp.github.io/office365-cli/cmd/spo/login/?ref=blog.lsonline.fr) cmdlet ```bash spo login https://contoso.sharepoint.com/sites/target-site ``` 1. Launch the `setup.sh` ```bash ./setup.sh --siteUrl https://contoso.sharepoint.com/sites/target-site --trackingUrl https://matomo.my-domain.com --trackingSiteId '2' ``` > \[note\]Note > > In this example, the package is deployed to the Site Collection App Catalog. You have other options illustrated into the [README.md](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/matomo/blob/master/README.md?ref=blog.lsonline.fr), that allow you to manage the deployment Pretty simple, isn't it? ### Samples of results ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPFx-Matomo-ResultVisitsLog-1.jpg) ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPFx-Matomo-ResultTransitions-1.jpg) ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPFx-Matomo-ResultSearchKeywords-1.jpg) ![](https://blog.lsonline.fr/content/images/2019/05/LsOnline-SPFx-Matomo-ResultRealTimeMaps-1.jpg) Some results of Matomo Analytics with SharePoint Framework Enjoy πŸ₯³ Hoping this post will help you πŸš€ ### SharePoint Framework Group People Web Part URL: https://blog.lsonline.fr/2019/04/20/sharepoint-framework-group-people-web-part/ Last updated: 2026-01-27T18:49:27.000Z Currently, with the modern experience of SharePoint Online, you can display through the *People* Web Part some information about selected users of your Tenant. ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-SP-PeopleWebPartPicker-2.jpg) ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-SP-PeopleWebPart-SearchPeople-2.jpg) ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-SP-PeopleWebPartResult-2.jpg) People Web Part of SharePoint Each time you want to add, edit or remove people, you have to edit the page, make the change to the Web Part and finally, save the page. Often, these person represents their own entity, the moderators or leaders of the SharePoint site and often, these people are managed on a SharePoint group to grant them more rights than other users. What would you say if you could view all members of a SharePoint group on a page? Manage a team in a SharePoint group and highlight the members of that team on a SharePoint page without having to edit the page at each change? Or whatever... It is a use case I often met, and this Web Part should help you too: ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-SPFx-GroupPeople.mp4.gif) Group People SPFx Web Part What it can do: - From the property pane, you can select one group among available SharePoint groups of the current site - From the property pane, you can choose between display the title of the group, display an alternate title, or nothing - The Web Part display all members of the selected group like the "compact" layout of the *People* Web Part of SharePoint - The members of the group are displayed in ASC order based on their `DisplayName` [ ![](https://blog.lsonline.fr/content/images/2021/01/gitlab-white-64.png) Group People repository ](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/group-people?ref=blog.lsonline.fr) Hoping this post will help you πŸš€ ### Display Markdown to your Bot Framework Hero and Thumbnail CardsπŸ’‘ URL: https://blog.lsonline.fr/2019/04/10/display-markdown-to-your-bot-framework-hero-and-thumbnail-cards/ Last updated: 2026-01-27T18:49:06.000Z I recently had the opportunity to really develop a Bot based on [Microsoft Bot Framework](https://dev.botframework.com/?ref=blog.lsonline.fr) that could work on [Microsoft Teams](https://products.office.com/en-us/microsoft-teams/group-chat-software?ref=blog.lsonline.fr). Without speaking about some aspects and technical choices, the principle of this Bot is simply to try to answer the questions of users asked on detailed thematics (Nothing too complex, you may say). > \[note\]**Note** > > I choose to use the NodeJS solution (because I'm working on MacOS 😁). All answers come from various sources and are mostly formatting thanks to [Markdown](https://www.markdownguide.org/?ref=blog.lsonline.fr). Everything is fine when the content is directly sent a message: ```javascript await turnContext.sendActivity(`# Markdown \n\n > Do you see me?`); ``` *The example of code above, send a message to the user formatted in Markdown.* ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-Bot-Msg-MarkdownFormatted.jpg) Markdown message sent from the bot The following idea is to format the answers thanks to [CardFactory](https://docs.microsoft.com/en-us/javascript/api/botbuilder-core/cardfactory?view=botbuilder-ts-latest&ref=blog.lsonline.fr) (add some actions, title, or whatever...) ```javascript displayAnswer(answer) { return CardFactory.thumbnailCard( '', // Title [{}], // Image [{ type: ActionTypes.ImBack, title: 'Action 01', value: 'One' }, { type: ActionTypes.ImBack, title: 'Action 02', value: 'Two' }], { text: `# Markdown \n\n > Do you see me?` }); } ``` The problem is the text is not formatted anymore and the Markdown tags are visible πŸ˜‘ ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-Bot-thumbnailCard-Markdown-sample.jpg) Example from the code above After some hours of research, I found an issue in GitHub in this regard: [Herocards, Thumbnail cards are not markdown compliant Β· Issue #356 Β· microsoft/BotFramework-WebChatHi, As indicated in the title, these objects are not markdown compliant which makes them unsuable with text content. Any clue whether markdown language will be supported? Thanks![](https://github.githubassets.com/favicon.ico)GitHubmicrosoft![](https://avatars2.githubusercontent.com/u/6154722?s=400&v=4)](https://github.com/Microsoft/BotFramework-WebChat/issues/356?ref=blog.lsonline.fr) The conclusion is (currently): HeroCards and ThumbnailsCard do not support the Markdown πŸ˜•. During my research, I have realized that HTML-rich text works! Great news, I can call all of my teammates and ask them to rewrite all documentation in HTML... Bad story. Finally, I also said to myself that may be possible to convert the Markdown content to HTML? Eureka! I found a Framework named [**showdown**](https://github.com/showdownjs/showdown?ref=blog.lsonline.fr) that *is "a Javascript Markdown to HTML converter, based on the original works by John Gruber" (John Gruber in addition!* πŸ™*).* This Framework is awesome and it saved my day... I will explain to you how I used it. First, install the package to your solution: ```bash npm i showdown --save ``` Next, add the reference and create an object instance of showdown to your target javascript file: ```JavaScript const showdown = require('showdown'); [...] let converter = new showdown.Converter(); ``` Convert your Markdown text to HTML: ```JavaScript converter.makeHtml('# Markdown \n\n > Do you see me?') ``` ![](https://blog.lsonline.fr/content/images/2019/04/LsOnline-Bot-thumbnailCard-Markdown-showdown-1.jpg) Example of thumbnail card with Markdown content The full code of my function is the following one: ```JavaScript displayAnswer(answer) { let converter = new showdown.Converter(); return CardFactory.thumbnailCard( '', // Title [{}], // Image [{ type: ActionTypes.ImBack, title: 'Action 01', value: 'One' }, { type: ActionTypes.ImBack, title: 'Action 02', value: 'Two' }], { text: `${converter.makeHtml('# Markdown \n\n > Do you see me?')}` }); } ``` Hoping this post will help you πŸš€ ### SharePoint Sticky Footer for classic experience URL: https://blog.lsonline.fr/2019/03/31/sharepoint-sticky-footer-for-classic-experience/ Last updated: 2026-01-27T18:45:56.000Z If you too, wish to have a *Sticky Footer* on your SharePoint site based on the classic experience, this post is for you. > \[info\]**Important** > > This post is not concerned by the modern experience of SharePoint sites Previously (before modern experience), a lot of my customers had or ask us to implement a footer on their SharePoint sites... Add a footer to SharePoint seem easy in the first approach but can be quickly a problem if the implementation is not correctly performed... Why? ## **The factors that you should be taken into consideration** - **Edit Master Page**: it was the method that often is privileged by the developers but once the development provided, each update need to deploy the new Master Page with the common involved problems (bad idea, forget it πŸ€“) for this kind of needs - **Script Editor** or **Content Editor**: I already saw a footer solution implemented through this kind of Web Part that has to be added on each page of the SharePoint site πŸ™„ ok, it works as long as you don't forget to add the Web Part into each page and it does not work everywhere (settings pages for example)... And I don't speak about an update that needs to edit the content of the Web Part 😁 (not recommended) - **Custom Action**: that is a better solution (and not only because I'm using it)! You can deploy it without change anything else on the target site, you can deploy it and update it in bulk and configure it differently for each need case - **Flexibility and improvement**: the first time a footer has to be simple, easy, and quick to set up but they need are changing (you may say, as always) - **Don't reinvent the wheel**: because it is not an isolated use case, a lot of developers have already work on this case and provide advice and solutions ## Here, a Sticky Footer solution I created for my first case, the first footer. I improved it each time one of my customers asked me to implement a footer with a new feature and I obtain this current "version" that allow you to: - implement a Sticky Footer via Custom Action - PowerShell script to implement it quickly and easily (maybe I will create a bash script based on *Office 365 CLI* if needed) - responsive (you can use it at the same time that [PnP Responsive UI](https://github.com/SharePoint/PnP-Tools/tree/master/Solutions/SharePoint.UI.Responsive?ref=blog.lsonline.fr)) - MUI (if based on a SharePoint list) or static - based on a SharePoint List - support SharePoint 2013, 2016 and Online - no framework dependency (bootstrap, JQuery, or whatever) - color based on the SharePoint theme ### Provision the SharePoint Sticky Footer To provision the SharePoint Sticky Footer, you need a PowerShell console and [PnP PowerShell module](https://github.com/SharePoint/PnP-PowerShell/releases?ref=blog.lsonline.fr). After installing PnP PowerShell module, go to [https://gitlab.lsonline.fr/SharePoint/javascript-customactions/tree/master/SharePoint.UI.StickyFooter](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/tree/master/SharePoint.UI.StickyFooter?ref=blog.lsonline.fr) and either clone or download the repository. To start the setup, you can use this command line: ```PowerShell .\SPStickyFooter.ps1 -TargetSiteurl "https://intranet.mydomain.com/sites/targetSite" ``` The script allows you to specify some additional options, like the HTML content (for static footer) or an image URL for the footer. See the [readme](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/blob/master/SharePoint.UI.StickyFooter/README.md?ref=blog.lsonline.fr) for more details. Hoping this post will help you πŸš€ ### Manage WiFi on Windows 8.1 URL: https://blog.lsonline.fr/2019/03/07/manage-wifi-on-windows-8/ Last updated: 2026-01-27T18:30:03.000Z We were surprised when we saw that Windows 8.1 seems removed the capability of connecting to a wireless network secured with *WPA/TKIP Enterprise*. This post will explain to you how to connect your Windows 8.1 laptop to a *WPA/TKIP Enterprise* wireless network and how to export the profile (to be able to import it later). ## Before starting Microsoft removed the capability to set up the WPA security wireless and its associated types of encryption (c.-TKIP). While most companies have switched to WPA2 or better, there are still many companies still using WPA/TKIP Enterprise. Even if Microsoft removed this feature from the wireless configuration interface, they apparently did not remove that capability from the operating system. Here are step-by-step instructions on how to get your computer or other device running Windows 8.1 to connect to a wireless network running WPA/TKIP Enterprise. ## Configuration > \[note\]**Note** > > In this case, the wireless network will named: `w_contoso` 1. Open a *Windows Command Prompt* (cmd) as **Administrator** ### Remove an existing profile 1. With the cmdlet below, display all wireless network profiles: ```bash netsh wlan show profiles ``` 1. If the profile `w_contoso` appear into the list of profiles, you have to delete it with this cmdlet: ```bash netsh wlan delete profile name="w_contoso" ``` ### Create a new connexion 1. Perform a right-click on the network icon from the Windows taskbar 2. From the contextual menu, click on Open the network and sharing center ![](https://blog.lsonline.fr/content/images/2019/03/Screenshot-2019-03-07-at-09.45.24-1.png) 1. Click on **Set up a new connection or network** ![](https://blog.lsonline.fr/content/images/2019/03/LsOnline-W81-NewNetowrkConfig.jpg) 1. Click on **Manually connect to a wireless network** ![](https://blog.lsonline.fr/content/images/2019/03/LsOnline-W81-ManualConfigSettings.jpg) 1. Enter information for the wireless network: ```plaintext Network name (SSID): w_contoso Security type: WPA2-Enterprise (temporarely) Encryption type: AES (by default) ``` ![](https://blog.lsonline.fr/content/images/2019/03/LsOnline-W81-ManualConfigWiFiInfo.jpg) 1. Once completed, click on **Next** then **Close** to finish ### Edit existing connexion 1. To ensure that the wireless network profile was correctly added to the list of wireless profiles of Windows, use the below cmdlet: ```bash netsh wlan show profile w_contoso ``` *without quotation marks around the SSID* ![](https://blog.lsonline.fr/content/images/2019/03/LsOnline-W81-WifiProfilemanualResult.jpg) 1. Enter the command ```bash netsh wlan ``` 1. Entrer la configuration du profile rΓ©seau sans fil: ```bash netsh wlan set profileparameter name=w_contoso authentication=wpa encryption=tkip authMode=userOnly ``` ### Check configuration 1. You can check the wireless profile configuration with the below cmdlet: ```bash netsh wlan show profile w_contoso ``` *without quotation marks around the SSID* ![](https://blog.lsonline.fr/content/images/2019/03/LsOnline-W81-WiFi-ContosoFinalResult.jpg) ### Export profile 1. To keep a backup of a configuration of the wireless profile, it is possible to export it into an XML file, like this: ```bash netsh wlan export profile name="w_contoso" ``` ### Import profile 1. To restore the configuration of a wireless profile, tape the below cmdlet: ```bash netsh wlan add profile filename="path\w_contoso-profile.xml" ``` ## Bonus ### Forgot password? 1. Retrieve the list of existing WiFi profiles ```bash netsh wlan show profile ``` 2. Display information and WiFi password in clear of `w_contoso` wireless network profile ```bash netsh wlan show profile "w_contoso" key=clear ``` Hoping this post will help you πŸš€ ### Hide SharePoint library or list URL: https://blog.lsonline.fr/2019/02/09/hide-sharepoint-library-or-list/ Last updated: 2026-01-27T18:29:23.000Z Frequently, when I am training final users after having to implement a new SharePoint portal or team sites; I have to explain some Best Practices including governance rules. One of them consists to not touch the native components of SharePoint to avoid some wrong side effects. Hide SharePoint library or list afterward. One of the most advice is to not touch default SharePoint libraries such as: - Documents - Form Templates - Style Library ![](https://blog.lsonline.fr/content/images/2019/02/Screenshot-2019-02-09-at-22.57.25.png) Default libraries of Modern SharePoint Team site from Site content Another case is when you have some custom SharePoint lists used for your custom developments, structural needs, or whatever... In conclusion, SharePoint lists or libraries that need to be read for all users authorized but not visible from "site contents" such as: - list of comments - list used for a custom footer - list of structural references - etc. Ok, how can you hide them? 🀨 From your SharePoint site, you can only natively set up unique permissions for a document library or list. It means that, if you want to hide a library or a list, you have to restrict all access to them for all targeted users... if you do that, these targeted users won't be able to access the data neither! In the case of the footer, it is not the desired final result, isn't it? Moreover, some users said to me: *"If we cannot delete or change them, why can we see them? Is it possible to hide them?"* > \[info\]**Important** > > When a list or library is hide, all of the content cannot appear on the search result anymore. ## SharePoint Designer To use this method, you need a Windows computer and download/install SharePoint Designer which you can get [here](https://www.microsoft.com/en-us/download/details.aspx?id=35491&ref=blog.lsonline.fr). 1. Open SharePoint Designer and connect to your target Site Collection ![](https://blog.lsonline.fr/content/images/2019/02/Screenshot-2019-02-10-at-00.15.20.png) 1. Open **Lists and Libraries**, select your SharePoint list or library ![](https://blog.lsonline.fr/content/images/2019/02/Screenshot-2019-02-10-at-00.15.35.png) 1. Check the checkbox **Hide from browser** and **save** (Ctrl \+ S) ![](https://blog.lsonline.fr/content/images/2019/02/Screenshot-2019-02-10-at-00.16.22.png) ## Programmatically ### PowerShell To use this method, you need a Windows computer and download/install PnP PowerShell which you can get [here](https://github.com/SharePoint/PnP-PowerShell?ref=blog.lsonline.fr). Thanks to *PnP PowerShell*, you can easily perform this kind of action. Via PowerShell, once connected with the cmdlet `Connect-PnPOnline` you can directly use this only one cmdlet: ```PowerShell Set-PnPList -Identity "Demo List" -Hidden $true ``` If you have implemented a *Site Factory* and you apply a [*PnP Template*](https://github.com/SharePoint/PnP-Provisioning-Schema?ref=blog.lsonline.fr), you can add the attribute `Hidden` with the value `true` to your XML *ListInstance* node: ```XML ``` ### From any platform To use this method, you just need **Bash** and the latest version of the [Office365-CLI](https://pnp.github.io/office365-cli/?ref=blog.lsonline.fr). Once connected with the cmdlet `spo connect` you can directly use this only one cmdlet: ```bash spo list set --webUrl https://contoso.sharepoint.com/sites/project-x --id 3EA5A977-315E-4E25-8B0F-E4F949BF6B8F --hidden true ``` ## Result ![](https://blog.lsonline.fr/content/images/2019/02/Screenshot-2019-02-10-at-00.18.07.png) Site Content of SharePoint after having to hide some libraries Hoping this post will help you πŸš€ ### Setup Google Analytics to Modern SharePoint from any platform URL: https://blog.lsonline.fr/2019/02/07/setup-google-analytics-to-modern-sharepoint-from-any-platform/ Last updated: 2026-01-27T18:42:45.000Z [**Google Analytics**](https://marketingplatform.google.com/about/analytics?ref=blog.lsonline.fr) is a web **analytics** service offered by **Google** that tracks and reports website traffic. SharePoint provides some reports too, but these ones can be quickly insufficient if you need more KPI. Previously, on the classic experience of SharePoint, it was possible to add Google Analytics script by: - Creating a Master Page and including the script (it was not a Best Practice by the way 😁) - Creating a Custom Action > Fast forward to today, modern SharePoint experiences support the most common scenarios that organizations use SharePoint for. Many organizations have already switched to using modern experiences, and many more are evaluating how they would benefit of modernizing their intranets. [Setup SharePoint Starter Kit from any platformSharePoint Starter Kit allows you to test-drive modern SharePoint experiences on your own tenant, and now you can set it up from any platform.![](https://blog.mastykarz.nl/favicon.png)Waldek MastykarzWaldek Mastykarz![](https://blog.mastykarz.nl/assets/images/2019/01/banner.png)](https://blog.mastykarz.nl/setup-sharepoint-starter-kit-any-platform?ref=blog.lsonline.fr) That is totally true! How to visualize in real-time or through a complete dashboard several native and custom KPI? ![](https://blog.lsonline.fr/content/images/2021/01/ga-logo-new-3.png) In addition, you can access several features for FREE. ## Google Analytics for Modern SharePoint - for everybody So, now... How to set up this solution for your Modern SharePoint sites? This subject has already been addressed in the post of [Joao Ferreira](http://handsonsharepoint.net/about?ref=blog.lsonline.fr). What can I bring more to that? 1. Upgrade his solution to use the latest version of [SharePoint Framework](https://github.com/pnp/generator-spfx?ref=blog.lsonline.fr) 2. Perform some enhancements 3. Allow you to deploy the solution from any platform thanks to [Office365-CLI](https://pnp.github.io/office365-cli?ref=blog.lsonline.fr). If you too, are a macOS user and working on several SharePoint solutions yourself, you want to have a way to provision Google Analytics, without having to use a VM or a Windows computer 4. Create scripts to implement the solution easier ## Google Analytics implementation I wrote two scripts that will allow you to implement the solution easily. ### Prerequisites 1. Google Analytics Tracking ID: [https://support.google.com/analytics/answer/1008080](https://support.google.com/analytics/answer/1008080?ref=blog.lsonline.fr) 2. Tenant App Catalog or Site Collection App Catalog: - Configure your Tenant App Catalog: [https://docs.microsoft.com/en-us/sharepoint/use-app-catalog](https://docs.microsoft.com/en-us/sharepoint/use-app-catalog?ref=blog.lsonline.fr) - Configure your Site Collection App Catalog *(optional)*: [https://docs.microsoft.com/en-us/sharepoint/dev/general-development/site-collection-app-catalog](https://docs.microsoft.com/en-us/sharepoint/dev/general-development/site-collection-app-catalog?ref=blog.lsonline.fr) 3. If you choose to use **PowerShell** solution, you'll need to install the **[PnP PowerShell module](https://github.com/SharePoint/PnP-PowerShell/releases?ref=blog.lsonline.fr)** 4. If you choose to use **any platform** solution, you'll need **Bash** and **[Office365-CLI](https://pnp.github.io/office365-cli?ref=blog.lsonline.fr)** > \[note\]Note > > The user account that will perform the following actions has to have sufficient permissions on the target sites collection and on the App Catalog. ### PowerShell (Windows only) 1. Download the **PowerShell solution** from the [repository](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/analytics/-/releases?ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2021/01/Screenshot-2019-02-15-at-09.59.59.jpg) 1. Unzip the package 2. From your *PowerShell terminal*, connect to your target site collection with [Connect-PnPOnline](https://docs.microsoft.com/en-us/powershell/module/sharepoint-pnp/connect-pnponline?ref=blog.lsonline.fr) cmdlet ```PowerShell Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/target-site ``` 3. Launch the `setup.ps1` ```PowerShell .\setup.ps1 -siteUrl https://contoso.sharepoint.com/sites/target-site -trackingID 'UA-000000000-1' ``` > \[note\]**Note** > > If you can't execute the PowerShell script, cause of security reason, before unzip the package, execute the [Unblock-File](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/unblock-file?view=powershell-6&ref=blog.lsonline.fr) cmdlet. > \[note\]Note > > In this example, the package is deploy to the Site Collection App Catalog. You have other options like illustrated into the [README.md](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/analytics/blob/master/README.md?ref=blog.lsonline.fr), that allow you to manage the deployment. ### Any platform (Linux, Mac OS, Windows) 1. Download **any platform** solution from the [repository](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/analytics/-/releases?ref=blog.lsonline.fr) ![](https://blog.lsonline.fr/content/images/2021/01/Screenshot-2019-02-15-at-10.00.42.jpg) 1. Unzip the package 2. Allow `setup.sh` script execution ```bash chmod +x ./setup.sh ``` 3. From your *Bash terminal*, connect to your target site collection with [spo login](https://pnp.github.io/office365-cli/cmd/spo/login/?ref=blog.lsonline.fr) cmdlet ```bash spo login https://contoso.sharepoint.com/sites/target-site ``` 4. Launch the `setup.sh` ```bash ./setup.sh --siteUrl https://contoso.sharepoint.com/sites/target-site -- trackingID 'UA-000000000-1' ``` > \[note\]**Note** > > In this example, the package is deploy to the Site Collection App Catalog. You have other options like illustrated into the [README.md](https://gitlab.lsonline.fr/SharePoint/sp-dev-fx-webparts/analytics/blob/master/README.md?ref=blog.lsonline.fr), that allow you to manage the deployment Pretty simple, isn't it? --- You will find below some additional information about the Google Analytics interface and its configuration (thank you Karen for your suggestion πŸ™) [Ultimate Beginner’s Guide to Google Analytics 4 (NEW 2020 Interface)If you’ve ever taken a quick peek at Google Analytics, you were probably thinking to yourself, β€œWhat is going on here? Where do I even begin?”![](https://dt2sdf0db8zob.cloudfront.net/wp-content/themes/websiteplanet/img/favicons/android-icon-192x192.png?v=1)Website PlanetWebsite Planet![](https://dt2sdf0db8zob.cloudfront.net/wp-content/uploads/2019/04/Beginners-Guide-to-Google-Analytics-850x435.jpg)](https://www.websiteplanet.com/blog/ultimate-beginners-guide-google-analytics/?ref=blog.lsonline.fr) Enjoy πŸš€πŸ₯³ Hoping this post will help you πŸš€ ### Install Workflow Manager for SharePoint 2013 URL: https://blog.lsonline.fr/2019/02/05/install-workflow-manager-for-sharepoint-2013/ Last updated: 2026-01-27T18:12:59.000Z > \[info\]**Important** > > This installation was performed in May 2016 > \[note\]**Note** > > Since one of my client is French, he installed all the environment in the French version of SQL Instance database. If it is your case too, please refer to the [issues](#issues) part ![](https://blog.lsonline.fr/content/images/2021/01/Workflow-Manager-Schema-2.png) SharePoint Farm Servers > \[info\]**Important** > > Workflow Manager must be installed on another server than the SharePoint one ## Software Prerequisites ### SharePoint Server - SharePoint Server (without Workflow Manager Installed) - Workflow Manager Client ### Workflow Manager Server - Workflow Manager ## Configuration Prerequisites 1. Create accounts and groups from the AD - WF Setup Account - WF Service Account - WF Administrator Group (WF Admins) - Setup Account - SPAdmin 2. SQL Server Accounts - From SSMS, add **WF Setup Accounts** permissions as a *sysadmin* 3. From the WF Server, logon with an administrator account - Add WF Setup to the *local administrators' group* ## SharePoint Prerequisites ### Minimum recommended services for development environments The following are the minimum SharePoint 2013 services and service applications recommended for *development environments*: 1. App Management service application 2. Central Administration web site 3. Claims to Windows Token Service (C2WTS) 4. Distributed cache service 5. Microsoft SharePoint Foundation 2013 Site and Subscription Settings service 6. Secure Store Service 7. User Profile service application (SharePoint Server 2013 only) ### Minimum requirements for a single server with a built-in database [Hardware and software requirements for SharePoint 2013Lists the minimum hardware and software requirements to install and run SharePoint.Microsoft DocsTechwriter40![](https://docs.microsoft.com/en-us/media/logos/logo-ms-social.png)](https://technet.microsoft.com/en-us/library/cc262485.aspx?ref=blog.lsonline.fr#section4) ## Installation and Configuration ### Installation 1. Log to the WF Server with **WF Setup Account** 2. Go to this site URL: [https://msdn.microsoft.com/en-us/library/jj193478.aspx](https://msdn.microsoft.com/en-us/library/jj193478.aspx?ref=blog.lsonline.fr) - click on **Installing Workflow Manager 1.0** link - Click on the *installation* link from the content Process Overview. This action will launch the **Web Platform Installer** 3. Search "Workflow Manager" from the search bar and click **Add associate** 4. Click **Install** 5. Arrive at the *configuration Step*, click **Continue** and close all windows 6. Get and install the latest Cumulative update of **Workflow Manager 1.0** [KB2799754](https://www.microsoft.com/en-us/download/details.aspx?id=36800&ref=blog.lsonline.fr) from *Microsoft Download Center* in accordance with the initial language of Workflow Manager 7. Get and install the latest **Cumulative update of Service Bus** [KB2799752](https://www.microsoft.com/en-us/download/details.aspx?id=36794&ref=blog.lsonline.fr) from *Microsoft Download Center* in accordance with the initial language of Workflow Manager ### Configuration #### Workflow Manager ##### SSL Usually, all Workflow Manager configurations support SSL encryption for the communications between the SharePoint Server and the Workflow Manager Server. Some other steps have to be followed before launching Workflow Manager Configuration Wizard: 1. From WF Server, open an MMC console and get **Add-In Certificate** ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-ComputerCertificateEnrollment-1.png) Computer Certificate Enrolment 1. Create a Certificate Enrollment Request (AD > Computer) ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-ConfigCertSettings.png) Configure Certificate Settings > \[note\]Note > > For this point, a Certificate Manager must be installed on the Farm Server ##### Wizard 1. On the WF Server, go to **Start Menu** and click on **Workflow Manager Configuration Wizard** 2. Once the Wizard has started, select the **Custom Settings** to configure Workflow Manager ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-LaunchWizard.png) Launch Workflow Manager Configuration Wizard 1. Fill in the several fields of the configuration form: - SQL Server Instance (DNS Name Server) - If you use the SSL encryption (recommended), click on **Advanced Options** and select **Enable SSL connection with SQL Server instance** ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-SSLWFSQL.png) Enable SSL WF/SQL - By default keep all settings since **USER ID** to connect to database. Use WF Service Account (ex: *WFService@contoso*) - If you choose to provide an SSL certificate, uncheck **Auto-generate** and specify the Certificates to use (generally, use the same certificate for all services) ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-ProvideCertADCS.png) Provide Computer Certificates from ADCS - At the end of the form, specify the administrator group of WF created previously (ex: *WF Admins* ) ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-SpecifyWFAdminsADGroup.png) Specify WF Admins AD group - Finally, check if everything is ok by clicking on the button **Test Connection** at the top of the form ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-CheckWFManagerConfig.png) Check Workflow Manager configuration 1. Click on the "next step" arrow ( TODO: an error message appear about the certificates not available on `LocalMachine\Personal`) 2. At this step, configure the BUS Service - Check the box **Use the same service account credentials as provided for Workflow Manager** ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-SvcBusConfig.png) Service Bus Wizard Configuration - Uncheck the **Auto-generate** certificate if you provide the certificates and specify them - Specify the administrator group of WF created previously (ex: *WF Admins*) ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-SpecifyWFAdminsADGroup-1.png) Specify WF Admins AD group - Check if everything is ok by clicking on the button **Test Connection** at the top of the form ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-TestSvcBusConfig.png) Test Service BUS Configuration ##### Workflow Manager Client > \[note\]**Note** > > This below steps have to be processed on all of SharePoint Servers farm. 1. Download and install **Workflow Manager Client**: [https://www.microsoft.com/en-us/download/details.aspx?id=35375](https://www.microsoft.com/en-us/download/details.aspx?id=35375&ref=blog.lsonline.fr) 2. Download and install the *cumulative update*: [https://www.microsoft.com/en-us/download/details.aspx?id=36800](https://www.microsoft.com/en-us/download/details.aspx?id=36800&ref=blog.lsonline.fr) 3. Be sure you have access to the Workflow Manager Server from the SharePoint Servers (try to access the URL: [https://WF-ManagerServer.contoso.com:12290/](https://wf-managerserver.contoso.com:12290/?ref=blog.lsonline.fr) or [http://WF-ManagerServer.contoso.com:12291/](http://wf-managerserver.contoso.com:12291/?ref=blog.lsonline.fr)) 4. Open a **SharePoint Administrator Shell** and **Run As Administrator** 5. Pairing command line: - **HTTPS** ```powershell Register-SPWorkflowService -SPSite "https://intranet.contoso.com" -WorkflowHostUri "https://sp-wfmanager.contoso.com:12290" ``` - **HTTP** ```powershell Register-SPWorkflowService -SPSite "http://intranet.contoso.com" -WorkflowHostUri "http://sp-wfmanager.contoso.com:12291" -AllowOAuthHttp ``` ## SharePoint Designer 1. Download and install **SharePoint Designer 2013** x64 en (the English and 64 bits version is recommended): [https://www.microsoft.com/en-us/download/details.aspx?id=35491](https://www.microsoft.com/en-us/download/details.aspx?id=35491&ref=blog.lsonline.fr) 2. Install the [KB2767858](https://www.microsoft.com/en-us/download/details.aspx?id=36744&ref=blog.lsonline.fr) --- ## Issues ### Pairing While you are attempting to pair the SharePoint Server and your Workflow Manager Server, an error 404 appear ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-SP-WFManager-IssuePairingError.png) Error SharePoint and Workflow Manager Pairing To fix it, download and install the Workflow Manager CU2 from Web Platform Installer or from the URL: [https://www.microsoft.com/en-us/download/details.aspx?id=42036](https://www.microsoft.com/en-us/download/details.aspx?id=42036&ref=blog.lsonline.fr) [Register-SPWorkflowService The remote server returned an error: (404) Not FoundThis errors pops out if you have installed SharePoint Server 2013 on Windows Server 2012 R2\. Its true that SharePoint 2013 now supports Windows Server 2012 R2 after the SP1 update. Even though you …![](https://secure.gravatar.com/blavatar/29e2b4b69efe4256aee652ce96e0fcef?s=32)Irshad Nazly's blogIrshadNazly![](https://min2dmax.files.wordpress.com/2014/06/wlemoticon-openmouthedsmile.png)](https://min2dmax.wordpress.com/2014/06/05/register-spworkflowservice-the-remote-server-returned-an-error-404-not-found/?ref=blog.lsonline.fr) ### Register-SPWorkflowService: Failed to query the OAuth S2S metadata endpoint at URI During the registration, the Workflow Manager is trying to connect to the SharePoint Server and more particularly [http://xxxx/\_layouts/15/metadata/json/1](http://xxxx/%5Flayouts/15/metadata/json/1?ref=blog.lsonline.fr). To fix this error, ensure: - The DNS server reference - Hosts file [Register-SPWorkflowService Failed to query the OAuth S2s metadata errorScenario: You have followed all the specified TechNet requirements/permissions in setting up SharePoint 2013 and Workflow Manager 1.o farm but when Registering Workflow manager with SharePoint site…![](https://s1.wp.com/i/favicon.ico)SharePoint Deal !hugheser says:![](https://sharepointdeal.files.wordpress.com/2013/07/wferror1.png?w=300)](https://sharepointdeal.wordpress.com/2013/07/08/register-spworkflowservice-failed-to-query-the-oauth-s2s-metadata-error/?ref=blog.lsonline.fr) ### Non-EN SQL Server **Service Bus 1.1** fix this issue. Before launching the Workflow Manager configuration, uninstall Service Bus 1.0 and install Service Bus 1.1 ### Workflow error 401 [https://summit7systems.com/workflow-2013-starts-and-then-immediately-cancels/](http://summit7systems.com/workflow-2013-starts-and-then-immediately-cancels/?ref=blog.lsonline.fr) Hoping this post will help you πŸš€ ### PnP Responsive UI v2.0.0 URL: https://blog.lsonline.fr/2019/01/29/pnp-responsive-ui-v2-0-0/ Last updated: 2026-01-27T18:12:31.000Z You would keep using the classic experience of SharePoint sites and you wish to provide a responsive behavior to your final users? The new version of PnP-Responsive could be your answer. You may already know the solution [**PnP-Responsive**](https://github.com/SharePoint/PnP-Tools/tree/master/Solutions/SharePoint.UI.Responsive?ref=blog.lsonline.fr) developed by the *PnP community* and more especially by [@PaoloPia](https://twitter.com/PaoloPia?ref=blog.lsonline.fr) (thank you πŸ™) for SharePoint. If not, shame on you 😁 Today, a lot of people could say: "ok, but why using PnP Responsive? The modern sites are natively responsive..." And yes, you are right! The modern sites are only available for SharePoint Online and SharePoint On-Premises 2019\. Therefore, if you are using SharePoint 2013 or 2016 you are not eligible to take advantage of the responsive ☹️ The first answer is: "Upgrade to SharePoint 2019 or migrate to SharePoint Online!". Once again, you are right! However, this is not easy for everyone and it can generate additional costs. Discussing the best solution is not the subject of this post. The subject is to explain to you why this solution can be interesting for you! The first thing is: "This solution is Open Source" = Free ($0, 0€) Since an open-source community developed this solution, a lot of people work with it and can contribute to it. That is awesome! If you are using it and you encounter an issue, you can quickly share your issue [HERE](https://github.com/SharePoint/PnP-Tools/issues?ref=blog.lsonline.fr) and maybe find a solution or get some help from someone else. Moreover, if you have a suggestion of improvement, you can push it yourself and a moderator will accept your *Pull Request* if everything is ok πŸ™ŒπŸ€ž Recently, a new version was released and provides a lot of improvement: ![](https://blog.lsonline.fr/content/images/2019/01/PnP-Responsive-V2-demo.mp4.gif) 1. no framework dependency (Bootstrap, JQuery, or whatever). This improvement was released before the new version but I think this is an important point 2. minified files for production environments 3. change rendering breakpoint in accordance with SharePoint them: - **Desktop**: screen width above *1024px* - **Tablet**: screen width between 640px and *1023px* - **SmartPhone**: screen width lower than or equal to *640px* 4. support **Oslo master page** (certainly the most important improvement) 5. better support with the Search page 6. update burger behavior to look like the modern pages one 7. support design builder (classic theme selector) 8. support a part of SharePoint forms 9. performance improvements Hoping this post will help you πŸš€ ### SharePoint site alert policy URL: https://blog.lsonline.fr/2019/01/24/sharepoint-site-alert-policy/ Last updated: 2026-01-27T18:10:57.000Z In your Microsoft 365 environment, you need to create multiple accounts with the "SharePoint Administrator" role, but by doing so, you take the risk that these user accounts will gain access to "sensitive" data stored in SharePoint sites collections. Currently, you can't prevent one or more of these user accounts to access specific SharePoint sites (that makes sense, they are SharePoint administrators) πŸ˜‘ So, how to secure these specific SharePoint sites? You can't?... not in the true sense of the word! You can configure alert policies such as "added site collection admin" to be notified or all activities in relation to sharing, users, and group management of one of several SharePoint actions. You will be notified as soon as at least one SharePoint criterion is met. Please find now below the steps how to implement this kind of policy on your Tenant: ### Set-Up 1. You have to be connected on your **Microsoft 365 Central Admin** as a *global admin* 2. Click on the **Security & Compliance** link from the left navigation of the central admin 3. From the left navigation, expand the **Alert** section by clicking on it, and click on **Alert Policy** 4. Click on the **New alert policy** button to launch the wizard and fill out the form ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-M365-NewAlertPolicyButton.jpg) 1. *Name your alert* - **Name**: name of your policy (ex: SharePoint Administrator) - **Description**: it is recommended (ex: notify me for any change about site collection administrator for a specific site) - **Severity**: to help with tracking and managing the alerts generated by a policy ("Assigning a higher severity to activities that can result in severely negative consequences, such as detection of malware after delivery to users, viewing of sensitive or classified data, sharing data with external users, or other activities that can result in data loss or security threats"). Since in this case, the alert is created for security access, the severity will be `high` - **Category**: to help with tracking and managing the alerts generated by a policy. Since in this case, the alert is created when permission was changed, the category will be `Permissions` ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-Alert-NameYourAlertScreen.jpg) 1. *Create alert settings* - **Select an activity**: use a filter to find quickly the type of activity. In our case, we want to be alerted when a site collection admin is added, so, we choose `Added site collection admin`. > Important: if you site collection uses security groups rather than user accounts as site collection administrators, this kind of alert will does not work. - add a condition **Site collection URL is**: this alert can be concerned only for a specific site(s). Add a condition to specify which site collections will be concerned (separate site collection URL by a comma) - add a condition **User is**: this alert can be concerned only for a specific user(s). Add a condition to specify which user(s) will be concerned if necessary (you have to know in advance which user(s) and if this list of users has to be updated, you will have to edit this alert setting) ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-Alert-CreateAlertSettings.jpg) 1. *Set your recipients* - **Email recipients**: specify which user has to be notified by email when an alert occurs (up to 500 recipients) ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-Alert-Recipients.jpg) 1. *Review your settings* - Keep **Yes, turn it on right now** selected if everything is ok ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-Alert-FinishSetp-1.jpg) ### Test your alert 1. Connect to your Microsoft 365 **SharePoint admin center** with another SharePoint Administrator account 2. Select the targeted site collection(s) on which you have bound the alert 3. Change the site collection administrators ### Result 1. The recipients receive an email ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-MailAlert.jpg) 1. From the **Security & Service > Alerts > View Alert**, a new alert was added ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-AlertView.jpg) 1. From the **Security & Service > Alerts > Dashboard**, if you have added the *Recent Alerts widget*, the graph was updated with the latest alerts > \[note\]**Note** > > You will find more details about severity, category, etc. on this [Microsoft Documentation](https://docs.microsoft.com/en-us/office365/securitycompliance/alert-policies?ref=blog.lsonline.fr) Hoping this post will help you πŸš€ ### Display hierarchical Term Sets to your Web Part URL: https://blog.lsonline.fr/2019/01/13/display-hierarchical-term-sets-to-your-web-part/ Last updated: 2026-01-27T18:09:45.000Z You have a SharePoint list or a documents library in which you manage the content by managed metadata; you want to display the content of this list in accordance with a selected path chosen by the users. Natively, without additional features to the site or list, you can use: 1. The column header, directly from the list view ![](https://blog.lsonline.fr/content/images/2019/01/Screenshot-2019-01-13-at-20.19.09.png) ![](https://blog.lsonline.fr/content/images/2019/01/Screenshot-2019-01-13-at-20.22.52.png) 1. With the new experience, the filter panel ![](https://blog.lsonline.fr/content/images/2019/01/Screenshot-2019-01-13-at-20.24.15-1.png) However, you have no native Web Part that allows you to display a custom path selector. Ok, but what for? The image you wish provides documentation about tools in accordance with a use case. The users follow the path of the use case and at the end, they should find all documents in accordance with the path. Like that: ![](https://blog.lsonline.fr/content/images/2019/01/LsOnline-FilesFilterTaxonomy.mp4-1.gif) Once the Term is retrieved, it is possible to display the result in accordance with this one. Below, the solution I have chosen: ## Get Taxonomy [PnPjs](https://github.com/pnp/pnpjs?ref=blog.lsonline.fr) to retrieve a Term Sets of the current site based on a field from the list: ```javascript sp.web.lists.getById('00000000-0000-0000-0000-000000000000').fields.getById('11111111-1111-1111-1111-111111111111').get().then((field) => { taxonomy.getDefaultSiteCollectionTermStore().getTermSetById(field.TermSetId).terms.get().then((t) => { console.log(t); /* HERE ALL TERMS FROM TERM SETS */ }); }); ``` The result is: ![](https://blog.lsonline.fr/content/images/2019/01/Screenshot-2019-01-13-at-22.23.39.jpg) ## Transform data Now, transform this result into an object that can be reused to display a tree. I chose the structure proposed by the framework [jsTree](https://www.jstree.com/docs/json/?ref=blog.lsonline.fr). First, create a function that allows getting each individual term: ```javascript public buildTree(ts: Array): Array { var tree = []; ts.forEach(term => { tree = this.branch(tree, term) }); return tree; } ``` `buildTree()` use the most important recursive function named `branch()` that allows to reproduce the hierarchy: ```javascript private branch(tree: Array, term: any, node: any = null, i: number = 0): Array { var pathOfTerm = term.PathOfTerm.split(';'); /* Switch level */ var c = node == null ? tree : node; if (i < pathOfTerm.length) { /* Ensure not loop recursive */ var r = c.find(function (obj) { return obj.text === pathOfTerm[i]; }); /* check if node already exist */ if (r) { /* If exist */ if ((i + 1) == pathOfTerm.length) { /* Update ID if node == current term */ r.id = term.Id.replace('/Guid(', '').replace(')/', ''); } else { /* recursive children */ this.branch(tree, term, r.children, i + 1); } } else { /* Not exists, create new node */ /* See : https://www.jstree.com/docs/json/ for all specification */ var o = { "text": pathOfTerm[i], "id": null, "state": { "opened": false }, "children": [] }; if ((i + 1) == pathOfTerm.length) { /* If it's a root node or last child, set ID */ o.id = term.Id.replace('/Guid(', '').replace(')/', ''); } else { /* recursive children */ this.branch(tree, term, o.children, i + 1); } c.push(o); } } return c; } ``` In this function, the following rows allow to define the template of each node : ```javascript var o = { "text": pathOfTerm[i], "id": null, "state": { "opened": false }, "children": [] }; ``` ```javascript o.id = term.Id.replace('/Guid(', '').replace(')/', ''); ``` And here the result of the object model: ![](https://blog.lsonline.fr/content/images/2019/01/Screenshot-2019-01-13-at-22.39.26.jpg) With this kind of data object, you can directly use the jsTree render or create your own HTML structure like that : ![](https://blog.lsonline.fr/content/images/2019/01/Screenshot-2019-01-14-at-10.21.46.jpg) ## Get the selected (clicked) Term Now, you probably want to get which term was selected, update the view and do something else... To do this, add an `addEventListener()` on your render tree nodes *(in my case, I'm using the CSS class `termSelector`)* and attach the click event to the following function that returns the object node selected : ```JavaScript public toggleSelectedTerm(tree: any, id: string): any { var n = tree.find(function (obj) { return obj.id === id; }); if (!n) { tree.forEach(e => { if (!n && e.children.length > 0) { n = this.toggleSelectedTerm(e.children, id); } }); } if (n && !n.edited) { n.state.opened = !n.state.opened; /* Add flag for avoid overwrite recursivity */ n.edited = true; } return n; } ``` > \[note\]**Note** > > Just be care that the event is bind only once. If you use this function : ```JavaScript var selectedNode = this.toggleSelectedTerm([buidTree return], [ID of selected term]); ``` don't forget to reset the flag added by the previous function ```JavaScript delete n.edited; ``` ## Next Step Display the content of the list or documents library in accordance with the selected term. Hoping this post will help you πŸš€ ### PnP PowerShell and Multi-Factor Authentication URL: https://blog.lsonline.fr/2018/12/27/pnp-powershell-and-multi-factor-authentication/ Last updated: 2026-01-27T18:08:03.000Z When you manage a Microsoft 365 Tenant, you often have to create accounts with some privileges/roles on the same Tenant. For example, an account as SharePoint Online administrator πŸ™„. Once you have created a Microsoft 365 Tenant for your company, some rules of governance have to be respected and mainly those security ones. One of them, which is a Best Practice, consists of activating the MFA (Multi-Factor Authentication) on accounts that have a specific role(s) (especially if it is a service account). You can configure the MFA to use text messages or mobile applications. I will show you how to configure it, expose you to the side effects of your PowerShell scripts, and how to deal with it. > \[info\]**Important** > > In this use case, it is an account with the SharePoint administrator role. ## Why enable MFA? The main reason is ***"increase security"***! Even if someone finds your password, he won't be able to connect to your account without validation or a code generated by your smartphone. And for other reasons like: - Users cannot use App Password (I'll explain to you below what it is exactly) to connect the Office Portal - App Password never expires (you can set "never expire password" for a specific account but it is not obvious to manage this kind of accounts and it is not recommended) - Users can change their password and the App Password stays the same - You can generate several App Passwords (I don't know if this case is really interesting but you can😁) - You can revoke all App Password in one shot - For security reasons, all accounts with admin role(s) should have MFA activated (especially for the Global Admin role) - If an enterprise wishes to have a good score on Microsoft Secure Score, enabling MFA is recommended (CSA CCM301, Control DSI-02, FedRAMP Moderate, Control IA-3, GDPR, etc.) There are still other differences/reasons, but here are the ones I expose to my customers and also why I generally advise activating the MFA. ## PowerShell script without MFA In this example, we'll use the [PnP PowerShell](https://github.com/SharePoint/PnP-PowerShell?ref=blog.lsonline.fr) Framework to connect and count the number of SharePoint site collections of Tenant. 1. From the PowerShell console, use the connect cmdlet : ```PowerShell Connect-PnPOnline -Url https://yourdomain-admin.sharepoint.com ``` 1. A Windows prompt should appear. Fill out login ([your-user@yourdomain.onmicrosoft.com](mailto:your-user@yourdomain.onmicrosoft.com)) and password ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-WithoutMFA-PSScript-Connect-1.JPG) 1. Now, to show all SharePoint site collections, use the below cmdlet : ```PowerShell (Get-PnPTenantSite).Count ``` ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-WithoutMFA-PSScript-CountSC.JPG) It works! πŸš€πŸ₯³ ## Configure MFA on an account ### Prerequisites 1. Connect to *Microsoft 365 Central Admin* with an account with sufficient rights 2. A smartphone 3. If you haven't already installed `Microsoft Authenticator App` on your device, you can do it from here: [Microsoft Authenticator – Securely Access & Manage Your Online AccountsThe Microsoft Authenticator phone app gives you easy, secure access to online accounts, providing multi-factor authentication for an extra layer of security![](https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE1Mu3b?ver=5c31)![](https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RWit7W?ver=ec28)](https://www.microsoft.com/en-us/account/authenticator?ref=blog.lsonline.fr) ### Configuration 1. From the *Microsoft Central Admin*, go to **Active users** 2. Click on the ellipsis located at the top bar and click on **Setup multifactor authentication** ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-MFA-ActiveUsers.JPG) 1. From the *Multi-factor authentication page*, select the target account that you want to enable MFA 2. To the right side, click on **Enable** ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-MFA-SelectUser.JPG) 1. From the dialog that will appear, click on **enable multi-factor auth** 2. From the successful message dialog, click on **close** ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-MFA-EnablePopup.JPG) ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-MFA-UpdateSuccessPopup.JPG) 1. Logout the current user or change browser 2. Log in with the target account that enabled MFA on it 3. Configure the Mobile App Authenticator 4. Generate your first App Password and save it somewhere > \[note\]**Note** > > Here, the link to access directly to the App Password manager: [https://account.activedirectory.windowsazure.com/AppPasswords.aspx](https://account.activedirectory.windowsazure.com/AppPasswords.aspx?ref=blog.lsonline.fr) That's done! πŸ‘ ## PowerShell script with MFA 1. From a new PowerShell console, use the connect cmdlet : ```PowerShell Connect-PnPOnline -Url https://yourdomain-admin.sharepoint.com ``` 1. A Windows prompt should appear. Fill out login ([your-user@yourdomain.onmicrosoft.com](mailto:your-user@yourdomain.onmicrosoft.com)) and password (like previously). But this time, after authentication, you should have an error message like this one : ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-WithMFA-SPScriptError.JPG) 1. Now, try again, but this time, use the App Password instead of user password ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-WithMFA-SPScriptAppPassword.JPG) It works again! πŸ₯³ pfiou --- ### It still does not work! Microsoft provides several methods of authentication and it is possible to block **Legacy authentication**. ![](https://blog.lsonline.fr/content/images/2019/07/LsOnline-MFA-LegacyAuth-Error-1.jpeg) Connect-PnPOnline does not support SharePoint Online credentials You can enable the *Legacy Authentication* with the following cmdlet: ```PowerShell Connect-SPOService -Url https://contoso-admin.sharepoint.com Set-SPOTenant -LegacyAuthProtocolsEnabled $true ``` > \[note\]**Note** > > You will have to wait a couple of times before the changes take effect... [Microsoft announces 24 hours](https://docs.microsoft.com/en-ca/azure/active-directory/conditional-access/block-legacy-authentication?ref=blog.lsonline.fr#what-you-should-know), but in my cases, it never took more than 15 minutes. > \[note\]Note > > In other use cases, MFA and App Password will not work, especially if you're using Microsoft Graph API. Other ways are available to connect to Microsoft 365 services like certificate or App Client/ID. Hoping this post will help you πŸš€ ### SharePoint Site Collection Error 403 URL: https://blog.lsonline.fr/2018/12/24/sharepoint-site-collection-error-403/ Last updated: 2026-01-27T18:05:52.000Z Have you ever encountered a 403 error on a SharePoint site collection? Personally, I am not able to reproduce this behavior. This being said, I already encounter this problem with one of my customers on a site's collection with data that cannot be lost. I still haven't found the cause; however, the property of the sites collection that causes it is `-LockState`. Below, the *SharePoint Online* **PowerShell** cmdlet that allows unblocking the sites collection: ```PowerShell Set-SPOSite https://contoso.sharepoint.com/sites/traget-site -LockState "Unlock" ``` Here, the *PnP* **PowerShell** cmdlet that allows unblocking the sites collection: ```PowerShell Set-PnPTenantSite -Url https://contoso.sharepoint.com/sites/traget-site -LockState Unlock ``` Hoping this post will help you ? ### Create a dynamic Table of Content for your SharePoint Wiki pages URL: https://blog.lsonline.fr/2018/12/23/create-a-dynamic-table-of-content-for-your-sharepoint-wiki-pages/ Last updated: 2026-01-27T18:05:33.000Z > Update 2019-05-22: add script to manage title from H1 to H6 > Update 2019-09-17: second script updated in accordance with feedback about browsers compatibility Since I explain to my customers that is a good idea to capitalize all data and knowledge, SharePoint can help your teams to do this. Let's focus on the knowledge part ? and I will explain to you why and how to implement a TOC and how to add your TOC into your Wiki pages. > \[info\]**Important** > > This tutorial only works for the Wiki pages based on the classic experience of SharePoint. > If you want to implement a Table Of Content into the modern pages, I created an other solution [A SPFx Table Of Contents Extension for SharePoint](https://blog.lsonline.fr/2020/05/13/a-spfx-table-of-contents-extension-for-sharepoint/) ## Why implementing a TOC into your SharePoint Wiki page? One of my customers has a dev team that quickly adhered to the idea that consists of capitalizing all of the guidances of development into SharePoint Wiki pages. Sometimes, some guidance pages have a lot of points and chapters that make the reading difficult, especially when a developer is looking for a particular chapter. Therefore, a TOC at the top of the page allows the reader to go directly to the by clicking on it. It can be really useful, isn't it? Even though SharePoint does not provide this kind of feature, it is easy to implement this kind of solution. ## How to implement a TOC into your SharePoint Wiki Page? After creating a SharePoint Wiki page and inserting the content into it, you have to insert an embedded code. To do this, click on the **Insert tab** of the SharePoint *ribbon* and click on "**Embed Code**": ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-SP-Insert-EmbedCodeWP-1.png) ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-SP-EmbedCodeWP-TOC-Code.jpg) Insert Embed Code into SharePoint Wiki page Then, insert the following code into the area: > \[note\]**Note** > > I deliberately added a lot of comments for your comprehension. You can remove them if necessary. ```HTML
    ``` Finally, save your page and enjoy ? ![](https://blog.lsonline.fr/content/images/2018/12/LsOnline-Result-TOC-sample.jpg) > \[note\]**Note** > > You can update your page content without changing anything of your TOC; This one is dynamic and reloaded every time the page is loaded. ## Update (2019-05-22) After several demands, I provide you a script that allows you to display a table of content that support headers level from 1 to 6: [Table of Contents from H1 to H6 ($82) Β· Snippets Β· Microsoft SharePoint / JavaScript Custom ActionsSharePoint JavaScript Custom Action Catalog![](https://gitlab.lsonline.fr/assets/touch-icon-ipad-retina-8ebe416f5313483d9c1bc772b5bbe03ecad52a54eba443e5215a22caed2a16a2.png)GitLab![](https://gitlab.lsonline.fr/uploads/-/system/project/avatar/7/SpBuildAppTools.png)](https://gitlab.lsonline.fr/SharePoint/javascript-customactions/-/snippets/82?ref=blog.lsonline.fr) Hoping this post will help you ? ### It's decided, I open my blog πŸš€πŸ’‘πŸ€πŸ€“πŸ€— URL: https://blog.lsonline.fr/2018/12/17/its-decided-i-open-my-blog/ Last updated: 2026-01-27T18:03:33.000Z I have been working for my clients, my employers, or myself for several years now on solutions, tools that meet functional and technical needs. Everything I carry out still allows me today to discover, learn a lot of things ... Since it is not always easy to understand, configure, install or implement some solutions, I spent a lot of time to debug, search, again and again, to find a cause and sometimes one or more solutions. Since each discovery can be reused for other projects, I made sure to put all this information aside in my little OneNote. Most of the time, it saved me a lot of time to not reproduce the same mistakes; however, these notes have never been used and are sometimes even obsolete. I am pretty sure that today, sharing my knowledge and experiences can also help other people in need and that they will in turn benefit from them; knowing that we were able to help, is always something rewarding. That is why, I will share on my [