Category: Technology

  • Event access management Power App with external barcode scanning for passes

    Event access management Power App with external barcode scanning for passes

    I had a request from a customer who is running a 10-day event where attendees are permitted in certain areas. There will be in excess of 500 attendees who will all be issued passes that will indicate which area they are permitted in and the pass could include a QR code. Each of the entrances to the different areas will be staffed where passes will be checked. The different areas have capacity limits due to fire, Health & Safety and COVID19 reasons. The event is away from their normal infrastructure so they can’t rely on the normal access control systems we’ve become familiar with. Due to this, the customer felt a more automated approach to access management would be beneficial. They also run similar events throughout the year so any investment would be reusable. While I’d have preferred to break open the microcontroller toolbox and built some #IoT based pass readers but the customer wanted to use the Power Platform and their existing Office 365 investments.

    Power App event entry control kiosk. Prototype #1.
    Power App event entry control kiosk. Prototype #1.

    I started off with my usual design-first approach, sketching out some wireframes and mapping the customer’s requirements back to wireframes and building out personas, user journies and the solution architecture. Part of my wireframes led me to want to verify the barcode capabilities and reassure myself with the approach. I’ve built a number of solutions that have used both the old web barcode scanner and the more modern barcode scanner. While those solutions were a great success I never felt 100% satisfied with the scanner capabilities. I often found it hard to scan barcodes or would have to scan them multiple times increasing the overall time to complete a task. This is where my caution originated particularly creating a contact-free event access management solution to reliably handle such high footfall.

    Barcode scanning capability comparrison

    One of the advantages of the web barcode scanner control is that it worked on desktop and mobile and it is visible on the screen which made it very obvious to an end-user to scan something. The control is obsolete because of poor performance, and the mobile Barcode scanner control replaces this control.

    The mobile barcode scanner control is limited to Android and iOS and requires activation to enable the camera to start scanning.

    There are some tricks to activate scanning but this can make editing and use between desktop and mobile hard, particularly if you fall down the trap of activating scanning via the OnVisible action of a screen. At this point, you will lose the ability to edit the screen and instead get a warning about the control only working on Android and iOS.

    Error when using the Mobile Barcode Scanner in the browser or editor.

    Another option is to use a barcode scanner. This obviously isn’t a native control to Power Apps as it is effectively just a keyboard but there are lots of different styles of barcode scanners out there so these should be considered too.

    Hardware barcode scanner comparrision

    So after building out a proof of concept using the mobile barcode scanner and after numerous failed attempts to read a QR code, it was obvious this wasn’t going to be a solution I could rely on. So I decided to take a different approach. I knew barcode scanners are seen as a keyboard when connected to a device. So I switched out the mobile barcode scanner control with a simple text field. I was able to process any entered text using the OnChange action with a text input control. I knew this was going to be something I could try with a barcode reader so I decided to buy a couple of units to test with. I could have just used a cheapo barcode reader gun but I wanted something that would be similar to those used in the final access control entry point solution.

    One is similar to a checkout barcode reader. It’s a Lenvii E688 wired USB barcode scanner. It has a really helpful LED that is activated with nearby motion. It scans incredibly well and has an adjustable beep to acknowledge each scan. I tested this on my #Windows11 machine and on my iPad and iPhone with the help of one of those USB to appropriate device dongle adapter thingy-mac-things.

    The other, an Alacrity Bluetooth barcode scanner is a handheld Bluetooth and wired reader. It too has an LED and has the longest range of the two when reading bar codes. It also comes with a base that allows the reader to be docked for continuous scanning and powered where LED is on continuously scanning. The dock makes for a great pass barcode reader. Another benefit to this barcode reader is that it connects via Bluetooth and therefore allows for the barcode reader to be placed in a more accessible location without being prohibited by cable length. The barcode reader can also be removed from the dock and used in wireless handheld mode should that be needed.

    The event access management and entry conrol app

    I built a single app that could be used for the different tasks required to manage the attendees and passes for the event. The solution includes attendee registration and allocation of passes at the start of the event, attendee and pass management throughout the event, tools for Fire, Health & Safety marshalls such as capacity tracking and muster point registers and entry control pass scanning. I won’t go into detail on the full solution but will instead concentrate on the entry control features.

    Entry control

    The key part for the entry control task was that it should be fast, contact-free and act as a companion to support the person staffing the entrance. There is no fancy airlock doors or barrier system preventing someone from entering nor is there likely going to be any rule breakers storming in when not permitted. The entry control part of the app will speed up whether someone is permitted in that area and provides clear visual aids to the entrance staff.

    PowerApp Entry Point screen.
    Pass permitted to enter.
    Pass is not allowed to enter.

    Rather than place two devices at each entry point to handle people entering and exiting, I built the app to support it from a single entry point device. If you have scanned in successfully and entered, then scan again when leaving it will acknowledge you have left the area and remove you from the current capacity headcount for that area.

    The video demonstrates scanning pass to gain entry and then scanning again when leaving.

    The thing with the barcode reader approach is that it requires a text input to place the scanned barcode text into. In a kiosk-based solution, this isn’t great as end-users can “play” so I set about making hiding the control from the screen. First I made the control hidden but that prevented any input from the barcode reader. I then tried changing all the controls colours to match the background. While this made the text input mostly hidden I was still left with a flashing text cursor that I couldn’t hide. Finally, I set the width and height of the control to 0.

    Text Input is hidden by setting the width and height as 0.

    There is one problem though. You must use SetFocus(TextInput) to place the text cursor into the text box. This resulted in the ability to scan barcodes while not showing anything on the screen.

    Use SetFocus to allow scanned barcodes to be entered but the textbox to remain hidden.

    I hope this inspires you to think differently when approaching a project that could leverage barcode scanning in Power Apps but also inspires others to use barcode scanning as they create a really efficient solution for capturing data 💖. I’ll try to share some more pictures and updates as the solution progresses, particularly of the implemented access management solution and barcode readers.

    Bonus: I ordered a tablet holder which arrived just before I published this post so I thought I could show some early pictures of the reader and tablet together to test how this could work for the event. I think it looks great 🤩

    Barcode reader attached to stand with tablet.
    Barcode reader and tablet together on stand.
  • Gist extension for VS Code

    Gist is a big part of my workflow. I’ve always been on the lookout for a desktop tool. Well, it turns out I was looking in the wrong place. A few days I discovered two VS Code extensions Gist and GitHub Gist Explorer. They both really great extensions and so far I’m really enjoying having Gist at my fingertips in VS Code.

    vscode-gist-profiles
    Gist
    Screenshot
    GitHub Gist Explorer

    Once you have installed the extension you will need to grab yourself an access token for GitHub – you can get a personal access token by going to settings and then accessing Developer Settings. Make sure you just give the token access to Gists.

    GitHub Gist Explorer seems to be my favourite so far. Having the explorer available in the side pain really helps and the command bar paste and save from clipboard features are really great!

    How do I use Gist

    The majority of my use if private where I have created secret Gists. I have a number of markdown Gists which I have named Gistsmarks which I use as bookmarks to jump to a collection of Gists like boilerplates for my blog articles.

    Any code I share on my blog is shared as a Gist. This allows me to embed the code in the article with a nice editor and provides me with version control too. When I started using Gists I painstakingly went through all my posts and converted any previous code blocks into Gists. Oh, and when I reference code I use the highlighted line(s) URL which is a cool trick too.

    Highlighting code in a Gist with the URL

    I also use Gist to share code and snippets with friends and customers (when it is appropriate of course). I also have runbook like Gists to quickly reference which provide basic lines of PowerShell to perform tasks and run common commands against Microsoft Teams in Office 365 for example. I also have a markdown file for each of my demo environments where I hold information about different personas I have created, areas where I have built out certain functionality and a basic changelog.

    While I’m on the topic of VS Code extensions I think I will write another post and share my favourites VS Code extensions.

    Hopefully, you got the Gist of things! See what I did there….I’ll get my coat.

  • Replicate SharePoint Hub site navigation to other Hub sites

    Replicate SharePoint Hub site navigation to other Hub sites

    I have been working with a large government department where Microsoft Services helped them transform their intranet to SharePoint Online leveraging all the modern capabilities available as well as rethinking what an intranet was. This work included envisioning to fully exploit all of Office 365 and a crucial Information Architecture (IA) design which also mapped their existing, complex and poorly performing hierarchy of subsites to several new hub sites and a completely flattened site structure. I hope to write more about this work soon.

    Primary intranet site navigation provider

    To create a consistent user experience, the look and feel for several hub sites was replicated, creating the feel of a single intranet. The hub site navigation also needed to be replicated, and that is wherein the challenge lay. The navigation cannot be easily copied from one site to another, let alone between hub sites, and thus this solution was born.

    We decided to create a dedicated hub site that only the intranet team can access. Within this hub site, we were then able to create the intended intranet navigation and get the headings, order and links just right without troubling anyone. Once we were happy with the navigation and testing successfully passed, the idea was that we would be able to replicate the hub site navigation to all our other hub sites. More importantly, the process could be easily repeated, keeping the intranet navigation updated across many hub sites. The task could also be automated but we opted to leave it as a manually initiated task.

    Script to replication hub site navigation to other sites

    The solution to the problem is a PowerShell script made up of two functions. One function that gets the navigation from the hub site acting as the master or primary navigation provider (supplied from a parameter). The other function replicates the navigation to other hub sites. The Get-SPOHubSiteNavigation function exports the hub site navigation from the site provided to a CSV file. The CSV file is then used by the Copy-SPOHubSiteNavigation function to replicate the navigation links to other sites. The process could be hijacked somewhat to add hub site navigation from a CSV file rather than reading it from an existing hub site. We found it was easier to get a feel for the navigation in a real SharePoint site rather than work with the information in a spreadsheet.

    Screen recording of the Copy-SPOHubSiteNavigation replicating navigation between two hub sites.
    Screen recording of the Copy-SPOHubSiteNavigation replicating navigation between two hub sites.

    You can also disable the export process by setting the -Export parameter to -Export:$false. This switch makes the Get-SPOHubSiteNavigation quite useful for displaying the hub site navigation in an accessible collection. This collection can be used with pipe functions, to filter or sort the collection, for example. This collection is also much easier to work with than using the Get-PnpNavigationNode -Location TopNavigatioBar -Tree cmdlet and parameters to show the full navigation structure.

    Hub site navigation collection displayed in a table.
    Hub site navigation collection displayed in a table.

    Observations

    As with many of my posts, I like to share any observations I have made during the work.

    • The cached Hub navigation appears to refresh every 30 minutes if left unchanged. You can force the cache to refresh by editing the links and then clicking cancel.
    • A JSON file gets saved to the /_catalogs/hubsite library which could be related to the cached navigation. It has a GUID based name e.g. 20d31c78-8a8c-499a-b953-ecc673344cef.json and appears to get modified by the System Account when changes to the hub site navigation are saved.
    • The cached JSON file looks like this:
    • This JSON file, in theory, could be read from a source site and the navigation element copied and injected into the JSON on a target site through manipulation of the JSON payload and the /_API/navigation/SaveMenuState API.
    • When trying to add a new navigation node using the Add-PnpNavigationNode cmdlet. If the parent node was invalid I got the following error. This wasn’t because the URL linked to a file or folder that didn’t exist as the error below suggests. Dave Garrad kindly calls out the fix for thisThe fix is to add -External to the Add-PnPNavigationNode cmdlet to tell PowerShell that the link is not in the same site collection.
    Add-PnPNavigationNode error
    Add-PnPNavigationNode : error when no resource or file is available from the Url supplied.
    • The script could benefit additional error handling, particularly to ensure the target site(s) provided are registered as hub sites.
    • Bonus tip! If you find you have lost changes to the navigation, this same JSON file is part of a library where version history is enabled. This file appears in hub sites and sites associated with a hub site. The version history might help you recover from any loss, but you won’t be able to restore it as the library appears to be read-only.
    Version history available for JSON file which I suspect ins the cached hub site navigation
    Version history available for JSON file which I suspect ins the cached hub site navigation

    I hope you find this post useful. As always #SharingIsCaring

  • PowerShell to manage the modern SharePoint Footer

    PowerShell to manage the modern SharePoint Footer

    So I’ll start by saying how bowled over I am by the engagement I’ve had after posting a tweet sharing that I had programmatically updated the new footer. For this, thank you, this kind of engagement and praise is why I love the community and contributing to it.

    My tweet sharing my excitement after creating the PowerShell to manage the modern footer in SharePoint Online.

    I want to share some numbers with you, which was one of the main reasons for pursuing this task.

    1. My customer had 180 sites where the footer needed configuring.
    2. Settings, change the look, select footer (three clicks)
    3. Enable footer, browser and select a logo and then upload it, enable displaying the footer name and then add the footer name text, apply settings and close settings (eight clicks)
    4. Edit links (one click), create a new link, add text, add a URL, save the link, then (four clicks) and then repeat for three other links (twelve further clicks). Then save the navigation (one clicks). Eighteen clicks for footer links.
    5. That is a total of 29 clicks per site — a total of 4,860 clicks for all these sites.

    Almost five thousand clicks is a lot of mouse work and this number doesn’t even factor in browsing to each site nor typing each of the values and URLs, which leaves a lot of room for errors too!

    Screen recording showing a click counter of the work involved in configuring the footer at scale.
    Screen recording showing a click counter of the work involved in configuring the footer at scale.

    #ThinkLean #WorkSmarterNotHarder

    To emphasise just why I wanted to achieve this programmatically. Colleagues started to perform this manually while I did some R&D. During this time a collection of sites were updated. However, even with signed-off designs, change request and final confirmation, the customer still changed their mind hence why I like to code and work lean. This kind of change is not uncommon. However, for any organisation that centrally manages sites, has a flattened modern information architecture (IA) or a Hubified intranet with many sites where a standard and consistent footer might be wanted, not being able to manage the footer through PowerShell or other means is a problem. Even managing variations of a standard footer is likely to be an issue for if there is no way to handle it programmatically. 

    The intranet team within a large government department I have been working closely with over the last two years are responsible for close to 200 sites. Performing tasks against these sites and making changes to them efficiently using PowerShell or other means is essential. Finally, we should not forget that trends, standards and regulations change over time. One such example is that regulations for internet and intranet sites within the government might require that certain information must be readily available from the footer, which would lead to a need for wide-spread changes. Even with their carefully designed flat site structure as part of their information architecture (IA) which leverages Hub sites this change is still site-by-site as the footer configuration is not inherited from a Hub site and therefore set independently.

    Exploring how the Footer works

    So with all this in mind, I started to explore how this could be achieved using PowerShell. The options and tools are limited and restricted given the environment. I felt that if this could be through the UI, then there must have been an API I could play with to achieve the same result. Off I went in my lab using Fiddler, SharePoint Online Client Browser, Edge Insider developer tools, Postman and VS Code. Troubleshooting and reverse engineering things is a childhood pastime. I found many other exciting easter eggs during this exercise that I hope to share too, but it was like there was a bounty on resolving the footer configuration.

    Colleagues in my team were also looking for a solution to similar problems for their customers. A colleague quickly followed up about some undocumented verbs he found in the site design schema (see Site design JSON schema on Microsoft Docs). This news also confirms what I learned from some PG colleagues. Sadly, the footer only has site design support right now.

    What I discovered through Edge tools that each change to the footer through the editing footer links or from the change the look pane invoked an API post to “/_API/SaveMenuState”. This post had a JSON payload with the configuration of the footer and also included any footer links. Win!

    Developer Tools in Edge where I discovered the call to /_api/navigation/SaveMenuState
    Developer Tools in Edge where I discovered the call to /_api/navigation/SaveMenuState
    Full JSON payload sent to the SaveMenuState API in Edge Developer Tools.
    Full JSON payload sent to the SaveMenuState API in Edge Developer Tools.

    Initial approach and exploration

    I took off with examples of this JSON payload that I obtained from Developer Tools after applying several different footer configurations. I started exploring how the API worked using Postman (this is an excellent tool by the way). To use Postman, I had to create an SP app to get an auth token from AAD so I could use Postman with SPO APIs. I gave the app full tenant access so I could explore things better. Getting started with Postman was a great lesson and one I want to share in a separate post, but Postman is now a vital tool for me when working with SharePoint Online. Once I had played with the API, I set out to achieve the same behaviour in PowerShell. 

    Screenshot showing a API test in Postman
    Testing different submissions to the API using Postman.

    PowerShell Script

    I set out with the intent to share my work as I know this was going to be of interest to lots of others. I decided to create multiple functions, so each part of the footer can be configured separately. I also built this with a view of contributing and sharing it as part of the SharePoint PnP module. The code is functional and not perfect. Let me walk you through it and share the entire thing at the end too.

    Note: the script uses the debug log the output information ($DebugPreference = "Continue").

    Enable/Disable SPO Footer – These two functions were created to quickly enabled and disable the footer with a simple function call.

    Get/Set SPO Footer (Logo and Text) – It is useful to be able to get the configuration of both the footer text and the footer logo. These functions can be helpful to validate the configuration, for example. These both exist in the JSON as nodes with consistent GUID for their “title” and similar they both have a “key” that identifies them. To simplify the functions I created an overarching function to run them all.

    Get/Add/Remove Navigation Links – This needs further work but it could leverage the existing Get/Add/Remove-PnpNavigationNode cmdlets. For my customer, I hardcoded the URLs in the JSON payload on line 417 but I provided a sample of how this looks on lines 408-415.

    Sample Usage – Examples of how this can be used has been provided lines 435-471 but here is an example of the functions.

    • Enable/Disable-Footer – Enables and disables the footer
    • Get/Set-SPOFooter – Get the configuration of the footer
    • Get/Set-SPOFooterText – Set the footer text
    • Get/Set-SPOFooterLogo – Set the footer logo
    • Set-SPOFooterLinks – Create footer links

    Full script

    Here is the script with all the functions and some examples. I’m going to reach out to Vesa and the PnP team to see about getting this included somehow. But, for now, enjoy. If you have any issues or comments, please let me know!

    Quirks to be aware of

    During my testing, I noticed a number of quirks I had to work around or that I want to share and make you aware of.

    1. When using Postman between sessions, you must refresh your auth token to continue accessing SPO.
    2. No value is available when reviewing $site.FooterEnabled using the Get-PnPSite cmdlet so you cannot check to see if the footer is enabled or not.
    3. When getting the footer, I noticed there seem to be several different states for how the footer configuration which might impact the GET functions however I have tried to mitigate this risk.
      1. Disabled
      2. Enabled with no configuration
      3. Enabled, but the JSON appears similar to when it is it disabled
      4. Enabled with configuration and or links.
    4. I noticed some sites had the footer enabled after the footer feature was released, while others it was disabled, this was why I built the function to check how the configuration of the footer.

    I hope you find this post helpful. Your engagement and feedback are what drive me to write posts like this, so please keep it up!

    #SharingIsCaring

  • Switch between modern SharePoint homepages using PnP PowerShell

    Switch between modern SharePoint homepages using PnP PowerShell

    This featured in Episode 44 of the SharePoint Dev Weekly podcast.

    I’ve been working on a modern intranet project amongst over projects for the last 12-months. This has been more about the transformation of content and business processes, rethinking information architecture and reimagining a modern intranet than it has been about custom development.

    I’ve been working on a modern intranet project amongst over projects for the last 12-months. This has been more about the transformation of content and business processes, rethinking information architecture and reimagining a modern intranet than it has been about custom development.

    We’ve recently been testing variations in the design of a homepage with different audiences. This side-by-side comparison has allowed end-user feedback, performance and accessibility testing. The same approach has also been useful for previewing and testing the capabilities of new features (like the new Yammer web part). The challenge comes when you need to promote or switch over one of these variations as the new site homepage. The homepage is the page users are directed to when first navigating to a site or clicking on the site logo. It is like as important as the index.html or default.aspx page existence to a website. Note that these variations of the homepage permit testing of content and not site configuration. To test navigation, theme or similar we have separate sites and environments for this purpose.

    To solve the problem switching the homepage from an existing page whilst preserving the home.aspx page name I’ve leveraged the SharePoint Pnp cmdlets to create a script that will rename or remove the current homepage (and can remove it through a toggle) and then rename an existing page to make it the new homepage.

    Set-SPNewHomePage script demonstration
    Demonstration of the Set-SPNewHomePage script in action.

    Use my PnP PowerShell script to replace the home.aspx page

    Alternative methods

    Change the default homepage through SharePoint

    Site Owners can use the out-of-the-box make homepage action to make any page the default homepage or welcome page. This is available from the toolbar in the site pages library. But this keeps the page name and means the default page is /sitepages/randompagename.aspx instead of the standard /sitepages/home.aspx that all sites have. From my perspective this is not great. Certainly, intranet-like sites should follow some basic content management principles. Call in a touch on the OCD side but consistently having a standard homepage is one of these for me.

    Screenshot of setting a new homepage in the site pages library.
    Screenshot of setting a new homepage in the site pages library.

    Change the welcome page site property through Site Settings or PowerShell

    Previously you could use the classic settings page (typically exposed by the publishing feature) or by browsing to /_layouts/15/AreaWelcomePage.aspx to make changes to the welcome page. This method no longer works and throws an error.

    As with the make homepage action describe earlier this changes the default homepage to the use the page name you have provided and means the site won’t be available if users have bookmarked the site with the page name (/sitepages/home.aspx) in the URL.

    Screenshot of the welcome page site settings page.
    Screenshot of the welcome page site settings page.

    What is my point? To this day can I still memory recall core settings pages. With these, you can quickly review or makes changes to settings pages rather than using the UI to navigate to them. This includes those that may no longer be exposed in the UI. Whilst my memory serves me well I don’t recommend this approach as these pages and settings are gradually being replaced with alternatives or removed by the SharePoint and Office 365 engineering team for a reason.

    Instead, you can also use Pnp PowerShell to change the site welcome page property. I’ve provided an example script below.

    As simple as my script is, it is the approach worth learning the most. I hope you find this article useful and as with all Pnp development effort. Sharing is caring!

  • How to daisy chain multiple monitors on a Surface Pro 3 running Windows 10

    How to daisy chain multiple monitors on a Surface Pro 3 running Windows 10

    I finally decided to create my dream home office setup however it wasn’t without complications due to a strange limitation with the new Windows 10 display settings. I thought the idea of daisy chaining multiple displays on my Surface Pro 3 dock using the single DisplayPort was not going to be possible.

    Let’s step back a few months. I recently upgraded to a Surface Pro 3 (SP3) and a dock to use when I’m working in my home office. I read from a few online sources that it was possible to connect multiple monitors to the SP3 through a single DisplayPort. This I thought was great, as I really dislike seeing lots of cables! While researching this subject I didn’t fund any specific reference any Dell U2913WM monitors and the SP3 happily working together. This post on the Surface blog was particularly helpful as it outlines the different ways multiple displays can be connected to the SP3. With this all this in mind, I filed DisplayPort Daisy Chaining to the back of my head to accompany my home office setup. Jump forward a couple of months and there’s no unboxing video of two 29″Dell (U2913WM) monitors but instead, a post to describe how I managed to set up two external displays with my Surface Pro 3 running Windows 10 via single DisplayPort and DisplayPort daisy chaining.

    Here is a summary and sketch of how I’ve wired my Surface Pro 3 with two monitors:
    – SP3 dock (mini DisplayPort out)
    – Dell U2913WM #1 (DisplayPort in)
    – Dell U2913WM #2 (Mini DisplayPort out from Primary to DisplayPort in)

    Sketch of my Surface Pro 3 with two external displays
    Sketch of my Surface Pro 3 with two external displays

    I was pretty confident this would all be straight forward to set up, so much so I fixed the two monitors onto a vesa desk mount (more on this later) and carefully squirrelled all the cabling out of sight before I’d even switched them on, but who am I kidding! I docked the Surface Pro 3 only to find that two monitors would only allow me to duplicate them. For some reason, I just couldn’t get the new display settings menu on Windows 10 to allow me to run these as two separate displays even though it recognised them both.

    Windows 10 Display Settings recognising three displays but only displaying two.
    Windows 10 Display Settings recognising three displays but only displaying two.

    After a little poking around, I discovered a setting (DisplayPort 1.2) in the control panel of the monitors. After enabling this, the displays all went blank for a moment while they reconfigured. But still no luck, I now had just one of the two external displays working, the other had no input.

    Enabling Display Port 1.2 through the Dell U2913WM setting.
    Enabling Display Port 1.2 through the Dell U2913WM setting.

    This is the point I thought it just wasn’t going to work. I’d checked drivers. Restarted my SP3. Changed cables. Toggled Display Port 1.2 off and back on. As all techies would, I clicked around a fair bit. I found that from the new Windows 10 Display Settings screen, there were hits back to the old Control Panel. It was on this screen I noticed the winning link – Adjust resolution!

    Enabling monitors on Windows 10.
    Enabling monitors on Windows 10.

    It was here I noticed that the third display was disabled. After enabling display, my SP3 was using all three displays! Excitement levels peaked at this point! It seems the new Windows 10 Display Settings screen does not display disconnected displays nor does it make it obvious to that you should use the Control Panel method. This is something I’ve shared with the Windows team via #WindowsInsider feedback and I hope is made easier in the future.

    All three displays available.
    All three displays available.

    About that mount. I’m using a triple monitor vesa mount due to the sheer width of two 29″ monitors. The trick is not to use the middle mount that attaches to the upright bar but instead use the two side arms. The two monitors sit together perfectly with this mount! They’re sitting about 40cm high off the desk which gives me plenty of clearance underneath to use the physical desk space I have and at this height, I get support from the headrest on my high-backed chair.

    One thing to note with this setup is that once DisplayPort 1.2 (DP 1.2) is enabled on either of the two monitors, the Dell Display Manager will not detect that display. The only way I’ve been able to get the tool working is to disable DisplayPort 1.2 on the secondary display. It’s a shame I can’t get the Display Manager tool to work as it is a really helpful tool to maximise on all the space the Dell U2913WM gives you. It allows you to easily snap windows to different areas of the display. I spent a short time researching the issue and it seems to be on Dell’s radar – not sure if this is specific to Windows 10 or DisplayPort 1.2 daisy-chained monitors or how soon it will be fixed but there was some guidance on the Dell Support forum.

  • #MSIgnite sessions available in a single spreadsheet

    #MSIgnite sessions available in a single spreadsheet

    Update (31/01/15): Session spreadsheet updated and now includes 275 sessions.

    Those involved with SharePoint, Office 365, Yammer, the communities and the wider industry will already know about the Ignite conference Microsoft has planned for May this year. Microsoft published the conference sessions on the Ignite website this afternoon, introduced through this Office Blog post.

    The Office Blog post included a video from Julia White in which she shared what to expect from the conference. She also said in the video “without giving away too much, be the first to see a lot of new technology”, hinting that we will probably see the next versions of SharePoint and Exchange etc. The SharePoint Twitter account also shared the tweet below, with another video (#InBillWeTrust) confirming the next version of SharePoint (SharePoint 2016) will be shared during the conference.

    The conference is just around the corner. At the time of writing this post, there are 272 sessions published on the website and I’m sure this will increase in the coming weeks and months. Over a year ago, I created a PowerShell script to help myself and others easily review all the sessions that were planned for the then SharePoint Conference (#SPC14).

    You’ll be pleased to know I’ve done something similar again this year, although this year I’ve quickly gone about it using jQuery. I plan to create and share a bookmarklet but until then I’ve shared the first Ignite sessions spreadsheet for your viewing. The latest version of the sessions spreadsheet and jQuery bookmarklet are shared below.

    MSIgnite Sessions Spreadsheet

    Javascript via JSFiddle

    Fingers crossed I can attend #MSIgnite and have the opportunity to meet the great people I met at #SPC14 again!

  • What types of email does SharePoint send automatically?

    What types of email does SharePoint send automatically?

    Update: After reviewing the SMTP logs, on a very active SharePoint 2013 environment and some further research, I now have an extensive list of the types of emails SharePoint sends. Most of these now include an example image of the email that is sent.

    I recently responded to a question posted to Twitter using the #SPHelp hashtag. Tim Ferro was trying to understand all the different types of email that SharePoint sends automatically.

    While I may have misunderstood his tweet to begin with, it certainly got me thinking about what emails does SharePoint actually send. I gave it some thought with a colleague and have produced this post as a result.

    1. MySite Cleanup Notification
    2. Task assigned to you notification
    3. Alerts
    4. Storage limit exceeded
    5. Sharing – Invited to
    6. Site Mailbox Created
    7. MySite Setup Notification
    8. Mentioned in a conversation
    9. Site Deletion Notice (Site Policy)
    10. Site Access Requests

    Example of SharePoint Emails

    There is very little information that provides an answer to Tim’s question. I’ve attempted to create a consolidated view of all the different types of emails that SharePoint sends. I have sourced example images from various sources on the internet. They have been credited to the author and include a link to the originating content.

    MySite cleanup notification

    MySite Cleanup Notification. Credit: SharePoint 2013 Admin blog http://sharepoint2013admin.wordpress.com/2013/11/19/my-site-cleanup-timer-job-2/
    MySite Cleanup Notification. Credit: SharePoint 2013 Admin blog http://sharepoint2013admin.wordpress.com/2013/11/19/my-site-cleanup-timer-job-2/

    Task assigned to you notification

    Task assigned to you email. Credit: Tomislav Tasic http://tomislavspadmin.blogspot.co.uk/2014/06/enable-email-notifications-for-tasks.html
    Task assigned to you email. Credit: Tomislav Tasic http://tomislavspadmin.blogspot.co.uk/2014/06/enable-email-notifications-for-tasks.html

    Alerts

    SharePoint Alerts. Credit: Merin Nakarmi http://sharepointrealm.blogspot.co.uk/2013/06/how-to-cusomize-alert-email-for.html
    SharePoint Alerts. Credit: Merin Nakarmi http://sharepointrealm.blogspot.co.uk/2013/06/how-to-cusomize-alert-email-for.html

    Storage Limit Exceeded

    Storage Quota Exceeded. Credit: Three Will https://www.threewill.com/2013/12/storage-quotas-in-sharepoint-online/
    Storage Limit Exceeded. Credit: Three Will https://www.threewill.com/2013/12/storage-quotas-in-sharepoint-online/

    Sharing – Invited to …

    Mentioned in a conversation email. Credit: Jennifer Mason, CMS Wire http://www.cmswire.com/cms/social-business/sharepoint-2013-social-features-highlights-019624.php?pageNum=2
    Mentioned in a conversation email. Credit: Jennifer Mason, CMS Wire http://www.cmswire.com/cms/social-business/sharepoint-2013-social-features-highlights-019624.php?pageNum=2

    Site Mailbox Created

    Site Mailbox Created. Credit: Mark Kashman http://blogs.office.com/2013/04/02/whats-new-in-sharepoint-online-top-10/
    Site Mailbox Created. Credit: Mark Kashman http://blogs.office.com/2013/04/02/whats-new-in-sharepoint-online-top-10/

    MySite Setup Notification

    MySite Setup. Credit: Sudhit Kesharwani http://sharepoint.stackexchange.com/questions/72530/sharepoint-mysite-changing-the-notification-email
    MySite Setup. Credit: Sudhit Kesharwani http://sharepoint.stackexchange.com/questions/72530/sharepoint-mysite-changing-the-notification-email

    Mentioned in a conversation

    Mentioned in a conversation
    Mentioned in a conversation email. Credit: Jennifer Mason, CMS Wire http://www.cmswire.com/cms/social-business/sharepoint-2013-social-features-highlights-019624.php

    Site Deletion Notice (Site Policy)

    Site Deletion Notice. Steven Boyle, SharePoint IT Pro Blog http://blogs.technet.com/b/tothesharepoint/archive/2013/03/28/site-policy-in-sharepoint.aspx
    Site Deletion Notice. Steven Boyle, SharePoint IT Pro Blog http://blogs.technet.com/b/tothesharepoint/archive/2013/03/28/site-policy-in-sharepoint.aspx

    Site Access Requests

    Site Access Requests. Jasper Oosterveld https://www.nothingbutsharepoint.com/sites/eusp/Pages/SharePoint-Online-2013-Request-Access-Procedure.aspx
    Site Access Requests. Jasper Oosterveld https://www.nothingbutsharepoint.com/sites/eusp/Pages/SharePoint-Online-2013-Request-Access-Procedure.aspx

    Other possibilities

    There are a number of other emails that SharePoint might send, which I have been unable to confirm at this time.

    • Health Analyser – Alerts
    • Managed Metadata Service – term managed and term submission
    • Solution resource usage – site collection exceeded daily resource usage
    • Membership requests (requests to join/leave groups)
    • MySite new followers and Colleague and keyword suggestions
    • Site Collection Upgrade Notification (2010 > 2013)
    • Created and Delete Upgrade Evaluation Site Collections
    • Removal notifications of user provisioned Site Collections
    • Search Service Application
    • Apps Service Application
    • eDiscovery
    • Record
    • Publishing
    • Retention

    Community Contribution

    Not stopping there, I have also asked the community via the Office 365 Technical Network on Yammer (10,000+ members). Let’s see what people come back with. In time I’d like to add more detailed summaries of these including a sample of the emails.

  • Event Receiver to Remove “Recent” from SP2013 Quick Launch

    Event Receiver to Remove “Recent” from SP2013 Quick Launch

    I’m sure removing the Recent heading from the Quick Launch in SharePoint 2013 has been talked about a million times over since SharePoint 2013 was launched. It’s been solved in this way and that way, by hand, with javascript and programmatically. In this post, I share the code to remove the heading with the ListAdded event receiver.

    With and without the Recent heading on the Quick Launch navigation.
    With and without the Recent heading on the Quick Launch navigation.

    Event receiver code

    It’s based on code provided as an answered on the SharePoint StackExchange website by Remko van Laarhoven. I’ve then wrapped in a list added event receiver so that it is executed each time a new list or library is added. As the list/library is then not available on the Quick Launch I’ve added a couple of lines to then show it.

    Update (22nd June 2014): since creating this solution I have since discovered that the Recent heading still is created even with the event receiver triggering when lists/libraries created from templates. I resolved this by adding a sleep before the code to remove the heading is executed.
    [code language="c"]
    System.Threading.Thread.Sleep(1500);
    This in conjunction with the jQuery method prevent users from ever seeing the Recent Heading whether they are viewing the page or editing the links on the page.
    [code language="js"]
    // Hide Recent on Quick Launch
    $("#ctl00_PlaceHolderLeftNavBar_QuickLaunchNavigationManager .ms-core-listMenu-root li:contains('Recent')").children().remove();
    $("#ctl00_PlaceHolderLeftNavBar_QuickLaunchNavigationManager .ms-core-listMenu-item:contains('Recent')").remove();
    [code language="c"]
    public class ListAddedEventReceiver : SPListEventReceiver
    {
    public override void ListAdded(SPListEventProperties properties)
    {
    base.ListAdded(properties);
    SPWeb web = properties.Web;
    if (web != null)
    {
    //Sleep
    System.Threading.Thread.Sleep(1500);

    //Remove heading
    var title = SPUtility.GetLocalizedString("$Resources:core,category_Recent", null, web.Language);
    SPNavigationNodeCollection nodes = web.Navigation.QuickLaunch;
    foreach (SPNavigationNode node in nodes)
    {
    if (node.Title.ToLower().Equals(title.ToLower()))
    {
    // Delete the recent heading node
    node.Delete();
    break;
    }
    }
    // Show list on the quick launch
    SPList list = web.Lists[properties.ListId];
    list.OnQuickLaunch = true;
    list.Update();
    }
    }
    }

    Download Remove Recent Heading Solution

    For those who don’t want to create the event receiver themselves in Visual Studio or don’t know how to, I have a packaged the solution so that you can deploy the WSP to your environment. For those who don’t know how to use this code, I will write a post explaining how to create this event receiver using Visual Studio from an IT Pros perspective very soon.

    jcallaghan.removerecentheading.wsp

    As with anything you download from the internet remember to review, rename and test this code/solution before using it in a production environment.

  • Long live the best SharePoint ULS Viewer

    Long live the best SharePoint ULS Viewer

    Update (15th June 2014): We may see a return of the SharePoint ULS Viewer very soon. Jeremy Thake and Office Dev indicated it is coming back to life very soon.

     

     

    Community Discussion (9th June 2014): SharePoint Consultant and MVP Vlad Catrinescu has started a discussion about possible replacements for the ULS Viewer on the SharePoint Community site (http://sharepoint-community.net/forum/topics/what-is-the-best-replacement-for-ulsviewer).

    After noticing a tweet from Brian Lalancette ‏(@brianlala, you might also know him through his AutoSPInstaller project), I gasped at the thought that the best ULS Viewer for SharePoint is no longer going to be available.

    Along with many others in the SharePoint community, I was quite surprised by this news and started to consider what alternative was available. I’ve used the ULS Viewer from MSDN so many times I have lost count and don’t know where I would be without it.

    The best ULS Viewer
    The best ULS Viewer

    For those who’ve found this post and just want to download a copy of the ULS Viewer tool, you’re in luck. I have preserved a copy of ULS Viewer as a .exe and a .zip archive – these are available here http://bit.ly/UlsViewer and http://bit.ly/UlsViewerzip.
    You might receive a warning from the URL shortening service when using the .exe link warning against directly downloading an exe – this is why I have also provided a ZIP version.

    Other SharePoint ULS Viewer tools…

    As the ULS Viewer is no longer available I thought I shared some alternative tools or techniques to get access to the SharePoint ULS logs.

    ULS Studio

    A Codeplex project that I’ve used on several occasions and does somewhat come close to the features that the ULS Viewer tool had – ULS Studio (https://uls.codeplex.com).

    ULS Studio
    ULS Studio

    CSOM for SharePoint Online

    If you’re using SharePoint Online you could follow Vardhaman Deshpande’s blog post (http://www.vrdmn.com/2014/03/view-tenant-uls-logs-in-sharepoint.html) and access the ULS logs using the Client-Side Object Model (CSOM).

    SPO ULS with CSOM - Vardhaman Deshpande
    SPO ULS with CSOM – Vardhaman Deshpande

    Developer Dashboard

    There’s also the ULS tab within the Developer Dashboard, although this is limited to reviewing errors related to those requests where the Developer Dashboard is displayed or used.

    The Developer Dashboard can be activated using PowerShell – SharePoint Developer Devendra Velegandla shares the PowerShell and reviews the Developer dashboard on his blog (http://www.sharepoint-journey.com/developer-dashboard-in-sharepoint-2013.html).

    $svc = [Microsoft.SharePoint.Administration.SPWebService]::ContentService
    $dds = $svc.DeveloperDashboardSettings
    $dds.DisplayLevel = "On"
    $dds.Update()
    ULS errors displayed in the Developer Dashboard
    ULS errors displayed in the Developer Dashboard

    PowerShell

    Use can even use PowerShell to get details about a correlation error. Wictor Wilén shares details about this method in an article on his blog (http://www.wictorwilen.se/Post/Working-with-SharePoint-2010-Correlation-ID-in-PowerShell-and-code.aspx).

    Get-SPLogEvent | out-gridview
    Get-SPLogEvent | Out-GridView
    Get-SPLogEvent | Out-GridView

    Summary

    While I’m not going to stop using the ULS Viewer – I can only recommend you use something to help you view the SharePoint ULS logs. Troubleshooting SharePoint is not easy but you can help yourself, firstly by always checking the event log and secondly being comfortable with your method of doing.

    Long live the best ULS Viewer.