Thursday, 15 December 2016

SharePoint Online - Branding with CSS

-----------------------------------------------------------------------------------------
This post is related to a larger group of posts called Migrate SharePoint to Office 365 - Planning & Steps
-----------------------------------------------------------------------------------------

I've gone with a Publishing Site Collection so that I can use the 'Alternate CSS URL' in Site Settings > Master Page.

First off, thanks to the following websites which helped get me started:
Here's what the end result will look like (if you have the same fonts):


Now for the CSS...

/* Design By : Brett Randall */
/*     Design Colours: Greens/Greys/Blues */
/*     Last Modified : 28/02/2017 */
/*     Description: CSS to rebrand SharePoint Online Publishing Site Collection that is using seattle.master */

/* TABLE OF CONTENTS
-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
/* WEB FONTS & STYLES
/* LAYOUT & OVERALL PAGE
/* RIBBON & SUITE BAR
/* HEADER
/* NAVIGATION (TOP NAV BAR)
/* SEARCH
/* NAVIGATION (SIDE NAV/QUICK LAUNCH)
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* WEB FONTS & STYLES
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */
@font-face {
  font-family: 'MuseoSans100Regular';
  src: url('../Fonts/museosans_100-webfont.eot'); /* IE9 Compat Modes */
  src: url('../Fonts/museosans_100-webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
       url('../Fonts/museosans_100-webfont.woff') format('woff'), /* Pretty Modern Browsers */
       url('../Fonts/museosans_100-webfont.ttf')  format('truetype'), /* Safari, Android, iOS */
}

@font-face {
  font-family: 'MuseoSans300Regular';
  src: url('../Fonts/museosans_300-webfont.eot'); /* IE9 Compat Modes */
  src: url('../Fonts/museosans_300-webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
       url('../Fonts/museosans_300-webfont.woff') format('woff'), /* Pretty Modern Browsers */
       url('../Fonts/museosans_300-webfont.ttf')  format('truetype'), /* Safari, Android, iOS */
}

@font-face {
  font-family: 'MuseoSans500Regular';
  src: url('../Fonts/museosans_500-webfont.eot'); /* IE9 Compat Modes */
  src: url('../Fonts/museosans_500-webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
       url('../Fonts/museosans_500-webfont.woff') format('woff'), /* Pretty Modern Browsers */
       url('../Fonts/museosans_500-webfont.ttf')  format('truetype'), /* Safari, Android, iOS */
}

.ms-rtestate-field h1 {
    font-size: 39px;
    font-weight:300;
    font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
    line-height: 60px;
    color: #666;
}

.ms-rtestate-field h2 {
    font-size: 24px;
    line-height: 30px;
    font-weight: normal;
    font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
    color: #666;
}

.ms-rtestate-field h3 {
    font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
    font-size: 18px;
    line-height: 30px;
    color: #666;
}

.ms-rtestate-field h4 {
    line-height: 20px;
    font-family: MuseoSans500Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
    font-size: 14px;
    font-weight: normal;
    font-style: italic;
    color: #666;
}

h1.ms-rteElement-H1B{
  color:#84BD00;
  font-size: 39px;
  font-weight: normal;
  font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
  line-height: 60px;
}

h2.ms-rteElement-H2B {
  color:#FF8F1C;
  font-size: 24px;
  line-height: 30px;
  font-weight: normal;
  font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
}

h3.ms-rteElement-H3B{
  color:#84BD00;
  font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
  font-size: 18px;
  line-height: 30px;
}

h4.ms-rteElement-H4B{
  color:#84BD00;
  line-height: 20px;
  font-family: MuseoSans500Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
  font-size: 14px;
  font-weight:normal;
  font-style:italic;
}

.ms-rteElement-P{
   color:#666;
}

/* LAYOUT  & OVERALL PAGE
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* Hide unnecessary page elements */
.ms-siteicon-img,  /* Image set as SharePoint site logo in Settings */
.ms-core-listMenu-horizontalBox .ms-listMenu-editLink,  /* Global navigation "Edit Links" when managed navigation is in use */
.ms-core-listMenu-verticalBox .ms-listMenu-editLink,  /* Current navigation "Edit Links" when managed navigation is in use */
#fullscreenmodebox  /* Focus on Content icon */
{
display: none;
}

/* Alter Suite Bar color */
#suiteBarTop > div,
#suiteBarTop #O365_TopMenu {
  background: #333;
}

/* Ensuring a gap between side nav & page content */
#contentBox{
    padding-left:12px;
}

/* RIBBON & SUITE BAR
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* Hide unnecessary page elements */
.o365cs-nav-header16 .o365cs-nav-o365Branding{ display:none !important; } /* O365 Suite Bar - Remove "Office 365" & "SharePoint Text & links */
.o365cs-nav-centerAlign::after{content:"Put Company Slogan Here"; font-size:20px; color:white;line-height: 48px; font-style: italic;} /* O365 Suite Bar - Add Mission Statement */

/* HEADER
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* Add padding to the header area */
#s4-titlerow {
  padding: 10px;
}

/* Site logo wrapper */
#siteIcon {
    margin-right: 0px;
    margin-top: 10px;
}

/* Add new logo image */
.ms-siteicon-a {
    background: #fff url('../Images/siteIcon.png') no-repeat right;  /* Logo image */
    width: 210px; /* Width of logo image */
    max-width: 210px; /* Duplicate the width value */
    height: 52px; /* Height of logo image */
    max-height: 52px; /* Duplicate the height value */
}

/* Wrapper around site logo wrapper */
#titleAreaBox {
    margin: 0;  /* Remove OOTB margin */
}

/* Page title text */
#pageTitle {
    margin-top: 10px;
    margin-left: 12px;
    font-family: MuseoSans300Regular, Arial, "Helvetica Neue", Helvetica, sans-serif;
    font-size: 39px;
    color: #84BD00;
    font-weight: normal;  
}

/* NAVIGATION (TOP NAV BAR)
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* Placement & Formatting */
.ms-breadcrumb-top > .ms-core-navigation {
    background: #FFF;
    display: block;
    height: 41px;
    width: 100%;
    text-align: left;
}

.ms-core-listMenu-horizontalBox {
    margin-left: 10px;
}

/* Item text formatting */
.ms-core-listMenu-horizontalBox li.static > .ms-core-listMenu-item {
    background-color: rgb(132, 189, 0);
    height: 16px;
    color: #FFF;
    font-family: MuseoSans300Regular, Arial, Helvetica, freesans, sans-serif;
    font-size: 13px;
    font-weight: normal;
    margin-right: 0;
padding: 10px 10px;
    border: 0px;
    border-right: #FFF 3px solid;
}

/* Hover */
.ms-core-listMenu-horizontalBox li.static > .ms-core-listMenu-item:hover {
    background-color: #999;
    color: #fff;
}
/* Hide the down arrow for drop down nav */
.ms-core-listMenu-horizontalBox .dynamic-children.additional-background{padding-right:0px; background-image: none;}

/* 2nd Level Nav modifications */
ul.dynamic{
    background-color: #666;
    color: #fff;  
    margin-left:3px;
    margin-top:2px;
    padding: 4px 0px;
    border: 0px;
    border-radius: 4px;
    min-width:213px; /* ensures div is as wide as the a{} nav tiles */
}

/* 2nd Level a{} tiles */
ul.dynamic > li.dynamic a{
    background-color: rgb(132, 189, 0);
    width: 190px;
    padding:10px;
    padding-left: 13px;
    color:#fff;
}

ul.dynamic > li.dynamic a:hover{
    color:#fff;
    background-color: #999;
}

/* SEARCH
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* Width of entire Search Box */
.ms-mpSearchBox{
    width: 259px;
    background: rgb(233, 234, 232);
    border-radius:4px;
}

/* Modify default formatting for input */
.ms-srch-sb input {
    width: 187px;
    font-size: 14px;
    color: #000;
}

.ms-srch-sb, .ms-srch-sb:hover{
    padding-top: 5px;
    padding-bottom: 5px;
    background: #fff;
    border: 0px;
    border-radius:4px;
}

#searchInputBox{
    float:left;
    margin: 10px;
}

/* NAVIGATION (SIDE NAV/QUICK LAUNCH)
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- */

/* Add colour to Quick Launch (side nav bar) */
#sideNavBox{
    background-color: #F4F4F4;
}

.ms-core-listMenu-verticalBox {
    background-color: #F4F4F4;
}

/* Folders/Headings */
.ms-core-listMenu-verticalBox > .ms-core-listMenu-root > li > .ms-navedit-linkNode{
    background: linear-gradient(-90deg, #D7F1F7, #84BD00 );
    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#84BD00, endColorstr=#D7F1F7, GradientType=1); /* Gradient workaround for IE9+ */
    font-size:14px;
    padding-left: 10px;
    padding-top: 7px;
    padding-bottom: 7px;
    color: #000;
    font-family: MuseoSans300Regular, Arial, Helvetica, freesans, sans-serif;
    font-weight: normal;
    border-bottom: 1px #F4F4F4 solid;
}

.ms-core-listMenu-item:visited{
    color: #000;
}

.ms-core-listMenu-heading{
    font-weight:bold;
}

li > a.ms-core-listMenu-item.ms-core-listMenu-selected:hover, li > a.ms-core-listMenu-item:hover, .ms-core-listMenu-heading:hover{
    background-color:#999;
    color:#fff;
}

.ms-core-listMenu-verticalBox li.static > ul.static > li.static > .ms-core-listMenu-item{
    padding-top:7px;
    padding-bottom:7px;
    padding-left:20px;
}

li > a.ms-core-listMenu-item.ms-core-listMenu-selected{
    background-color: #84BD00;
    color: #000;
}

.ms-core-listMenu-item, .ms-core-listMenu-item:link{
    color:#000;
}

Friday, 2 December 2016

SharePoint 2010 - Automate Site & Group Creation with Nintex Workflow 2010

What
Nintex Workflow has an action to create a site automatically in SharePoint, but it's functionality is quite limited.  You can't create groups and you can't add staff to those groups.  This tutorial shows you how to create a Nintex workflow to automate the whole process using SharePoint Web Services.

Why
As most SharePoint administrators are aware, it's ALWAYS a bad idea to give staff the ability to create SharePoint sites.  They will end up creating them for the wrong purposes, will not maintain them, no retention policies will get assigned to them, etc.

However, you don't want to restrict your users creative freedom.  You want to govern it in a manageable way.

In order to keep track of all your SharePoint sites, we need to ensure that when we allow staff to create sites/content, it is being properly tagged with the right information.  As long as you are logging & tagging sites with extra data, you can easily govern and manage those sites far into the future.

This tutorial isn't simply how to automate a process that SharePoint already does.  It's automating that process while enforcing that users tag their sites with data that help you manage SharePoint easier.

We are going to use the example of Project Sites.  Project sites have a known lifespan, usually between 1 month & 2 years depending on size.  We want to capture that information so the sites don't hang around for too long.

How
There are 6 steps in my workflow, they are:
  • 1. Set Variables
  • 2. Create Site
  • 3. Create Group
  • 4. Add Group to Site
  • 5. Add Members to Group
  • 6. Send Emails

First:  Create a custom list with the following columns (depending on your needs):

  • Project Name
  • Project Description
  • Department
  • Project Sponsor
  • Project Manager
  • Project #
  • Estimated Completion Date

1. Set Variables
I also created Workflow Variables for my Group Names that had the following naming conventions: {Project Name} - [AccessType]

2. Create Site
Use the following Nintex Action to create a site and add all the data you will collect from your list: Insert Action > Provisioning > Create Site


3. Create Group
Use the following Nintex Action to query a Web Service:  Insert Actoin > Integration > Call Web Service

The image below describes what you need to input into each field to successfully run the AddGroup Web Method within the UserGroup.asmx Web Service.

This will create a group on your Site Collection without access to anything.

4. Add Group to Site
the hard part...

Now we need to give the group access to your newly created site.  Create another Call Web Service Action.

The picture will explain most things, however, to get the PermissionMask value (a value assigned to a permission level like Contribute,Read Only, etc), you need to run the following Powershell script on your server: Retrieve the Permission Mask Values for a Site using Powershell

Once you have that, insert the following information to add the group to your newly created site:
Running the AddPermissions Web Method through the Permissions.asmx web service

5. Add Members to Group
You don't need to do this, but if you're feeling keen you can also run a web service to add a user to the newly created group like this:
running the AddUserToGroup Web Method through the UserGroup.asmx Web Service

6. Send Emails
Of course now you want to send a nice customised email to your user with all the information they need!


Thoughts?
This saves our team so much time, while allowing us to govern site creation and ensure that all sites have metadata tagged against them !

Have you got any cool tricks to help automate governance that you'd like to share?

If you liked this post:

Credit where it's due

SharePoint 2010 - Retrieve the Permission Mask Values for a Site using Powershell

This article stems from another article explaining how to Automate Site & Group Creation with Nintex Workflow 2010

What
Use Powershell to retrieve detailed data about the permission levels on a particular site

Why
I was looking for a way to automate Site & Group creation using nintex workflows.  In order to create groups, you need to call a SharePoint Web Service.  That Web Service requires an input value called 'permissionMask (int)'.

This powershell script will allow you to find the correct permission Mask related to your particular environment & permission levels.

How
Jump onto your WFE, open up SharePoint Powershell as admin and paste in the following code (with the site you wish to retrieve data for:

## Get site permissions using SharePoint 2010 web service in powershell
$uri="http://rootsite/subsite/_vti_bin/Permissions.asmx?wsdl" 
## $siteName is a string which contains the site name for which you need to get the permissions
[String]$siteName="site name"
## $type is a string which contains the object type - List
[String]$type="Web"

## Web Service Reference - http://rootsite/subsite/_vti_bin/Permissions.asmx
$permissionWebServiceReference = New-WebServiceProxy -Uri $uri -UseDefaultCredential 
[System.Xml.XmlNode]$xmlNode=$permissionWebServiceReference.GetPermissionCollection($siteName,$type)

## Creates an GetSitePermissions.xml file in the D:\ which contains the permissions for the site
$output = New-Object -TypeName System.IO.StreamWriter -ArgumentList "C:\temp\GetSitePermissions.xml", $false
$output.WriteLine("<?xml version=""1.0"" encoding=""utf-8"" ?>")
$output.WriteLine($xmlNode.OuterXml)
$output.WriteLine() 
$output.Dispose()

Once the script has run, navigate to C:\Temp and grab the Mask value against the group that has the permissions you want to mimic.


Credit where it's due
Vijai for providing the code: http://www.c-sharpcorner.com/blogs/get-site-permissions-using-sharepoint-2010-web-service-in-powershell

Wednesday, 30 November 2016

Office 365 - SharePoint Online: Run a Report to List Your SharePoint Service Administrators

What
I've begun setting up the governance model for SharePoint Online and was working out the best way to ensure when I give someone SharePoint Administration Access that they automatically have full access to administer every Site Collection.

My decided method is to use the 'SharePoint Service Administrator' Group.  This is the group that you are added to when your O365 User Account is assigned the 'SharePoint Administrator' Role.


Why
My reasoning is that way when a staff member joins the team you only need to get them added to one spot and they are good to get on with the work.

Problem
Occasionally you will want to check that the right staff have access.  How do you report on who is a member of that group!?  I searched high and low to no avail.  When that fails, there's only one choice...  Powershell.

Here's the script you need to run in order to bring back a list of every user that has been given SharePoint Adminstrator Access:

#Connection to Office 365
$msolcred = get-credential
connect-msolservice -credential $msolcred

#Bring back a list of all users that are a member of the SharePoint Service Administrator Role
Get-MsolRoleMember -RoleObjectId (Get-MsolRole -RoleName “SharePoint Service Administrator”).ObjectId | ft –AutoSize

That's it!

Do you happen to know of a better way?  Let me know.


Credit where it's due
Brian Laws for providing the Powershell Script: http://summit7systems.com/delegate-sharepoint-online-administration-without-tenant-admin/ 

Monday, 28 November 2016

SharePoint Online - Switching Between Classic & New Experience

Did you click the 'return to classic SharePoint' button in SharePoint Online and are unsure how to get the New Experience back?

You need to clear all cookies from your browser and load up the site again.

There doesn't seem to be any button in the GUI that allows you to switch the new experience back on for your specific profile.

Update 27/07/2017: Microsoft have advised that they are adding a 'return to Modern UI' button so people can quickly switch back and forth

Sunday, 2 October 2016

Migrate SharePoint to Office 365 - Planning & Steps

WORK-IN-PROGRESS

A repository of resources containing what you need to consider before you migrate your On-Premises SharePoint environment to Office 365 (SharePoint Online).

This area contains in-depth detail around the planning stage for your SharePoint Migration and how to gather the data you need to be properly prepared come migration day (in no particular order):

[[Measuring On-Premises SharePoint Bandwidth]]
[[Gathering Storage Requirements for SharePoint Online]]
[[Backup & Recovery Options]]
--[[3rd Party Tools]]
--[[Preservation Hold]]
----[[Calculating Storage Requirements for Preservation Hold]]
[[Migrating Content]]
--[[Employee Experience]]
[[Information Architecture]]
--[[Data Retention & Versioning Policies]]
--[[Archiving Data]]

Monday, 6 June 2016

Export Group Membership From Active Directory Using Power Query

If you need to export a list of staff from an Active Directory Group, follow these steps.  Allows you to gather all the names & usernames of staff in a particular group and save the information into Excel.

Step By Step How To:
  • Open up Excel > Power Query Tab
  • Click From Other Sources > From Active Directory:
  • (In Excel 2016 this is found under: Data Tab > New Query > From Other Sources > From Active Directory)
screenshots from Excel 2016 on left, Excel 2010 w/ Power Query Add-on right
  • A popup will ask you to enter your domain name.  It should already be populated with the correct information but if not, input your companies domain name & Click OK:

  • In the Navigator that opens up, expand your domain tree and double click group:


  • You should now see a list of all groups in Active Directory in the Power Query Editor:

  • In order to find & filter for a specific Group, Click the Down-Arrow for the 'distinguishedName' column > Text Filters > Contains...

  • Type the name of your Group & hit OK (Text box is case sensitive!):
Here I am looking for users of the group 'Enable_EB_Screensaver'.

  • Now we want to list all of the staff that are members of the group.  To do this, Expand the group column and unselect everything except the 'member' column:

  • Now expand the group.member column:

You should now have a row for every member inside the group:

Right-Click the group.member column and select 'Unpivot Columns'

  • You should now see a 'Value' column at the end of your spreadsheet.  Click the expand button and select the following columns: displayName, sAMAccountName
  • Now you should have a nice list of all staff that are members of your Active Directory Group!  Click 'Close & Load' to load the data into Excel!


Quick Method How To:

If you're already a bit of a wiz with Power Query, simply copy this code into the Advanced Editor and replace anything highlighted in RED with your own organisational information.

let
    Source = ActiveDirectory.Domains("[DomainName]"),
    [DomainName] = Source{[Domain="[DomainName]"]}[#"Object Categories"],
    group1 = [DomainName]{[Category="group"]}[Objects],
    #"Filtered Rows" = Table.SelectRows(group1, each Text.Contains([distinguishedName], "[ActiveDirectoryGroupName]")),
    #"Expanded group" = Table.ExpandRecordColumn(#"Filtered Rows", "group", {"member"}, {"group.member"}),
    #"Expanded group.member" = Table.ExpandListColumn(#"Expanded group", "group.member"),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Expanded group.member", {"displayName", "top", "posixGroup", "msExchIMRecipient", "msExchBaseClass", "msExchCustomAttributes", "mailRecipient", "securityPrincipal", "distinguishedName"}, "Attribute", "Value"),
    #"Expanded Value" = Table.ExpandRecordColumn(#"Unpivoted Columns", "Value", {"displayName", "sAMAccountName"}, {"Value.displayName", "Value.sAMAccountName"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Value",{"displayName", "top", "posixGroup", "msExchIMRecipient", "msExchBaseClass", "msExchCustomAttributes", "mailRecipient", "securityPrincipal", "distinguishedName", "Attribute"})
in
    #"Removed Columns"


Notes

Feedback
How did you go?  Loving it?  If so, check out my other posts on Power Query:

Monday, 9 May 2016

Simple Answers - Question #1: What is Office 365 (O365)?

There is a lot of hype about businesses moving to Office 365, but what exactly is it and why is it so popular?  There are a waft of people (even in IT!) that have never heard of Office 365.  Over the next few months I will help demystify Office 365 & all the things great products that come with it.

Question #1: What is Office 365 (O365)?

O365 is a suite of products provided by Microsoft that can be purchased for a monthly or yearly fee. There are two basic types of subscriptions, Personal or Business.

As part of a personal subscription , you are provided with the latest version of Microsoft Office (2016) which can be installed on any device. This includes Word, Excel, PowerPoint, OneNote, Publisher, Outlook, etc.

As part of a business subscription, in addition to a copy of Microsoft Office 2016 for all staff, you also get the option of using any of the list of products below which I will go into more detail on later:

  • Yammer
  • Skype for Business
  • Exchange Online (email)
  • SharePoint Online
  • OneDrive
  • Power BI
  • Delve
  • Sway
  • PowerApps
  • Flow

Sunday, 1 May 2016

From Intranet to Digital Workplace

On the 28th-29th April 2016, I attended the Digital Workplace Conference in Melbourne.  Here are my notes & thoughts about one of the sessions.

Session: From Intranet to Digital Workplace

Speaker: James Robertson - @james_steptwo

Session Takeaways:
  • Intranets should achieve the objectives of the business.  Shouldn't be used for any one team to push their agenda or workload onto others.
  • James' 3 simple steps for building a Digital Workplace:
    1. Have projects to utilise the technology currently available
    2. Develop a strategy for the technology that is on the horizon
    3. Have a vision to justify what paths you choose & that plainly explains what you are trying to achieve 

  • 6x2 Methodology - James' every-6-months approach to choosing the most critical & beneficial projects for the business.  As well as how to get executive buy in for your vision.
  • A Week in the Digital Workspace - A vision of how we will work in the future, and how to align that vision with your business objectives.
  • Showed great examples of next-level workplaces, utilising intranet to lower costs & increase productivity.
My Musings:
  • Building a digital workplace isn't about a sexy intranet, although that's a good start!  It's about having a long-term vision of where you are trying to get to.  The vision in turn justifies why you've chosen a certain strategy & why it's worthwhile for the business to keep funding you on your selected projects.
  • Every department should have a story about what they are trying to do and how it aligns with business objectives.
  • Does your IT department have objectives for this year?  Are they tangible?  Do they match what the company is trying to achieve?  Do they align with IT's long term vision of what the companies technology suite should look like?
Rating: 5/5 Strategic Visions

Reasoning:  Great speaker, inspirational, logical.

Agree or Disagree?  Please feel free to discuss your thoughts in the comments below!

Gather-Decide-Act: Three Business Process Case Studies That Transform Data Collection Into Inspired Action

On the 28th-29th April 2016, I attended the Digital Workplace Conference in Melbourne.  Here are my notes & thoughts about one of the sessions.

Session: Gather-Decide-Act: Three Business Process Case Studies That Transform Data Collection Into Inspired Action

Speaker: Mike Fitzmaurice - @MikeFitz

Session Takeaways:
  • Simple solutions using SharePoint lists and Nintex Forms to gather data easily
  • Nintex Forms allow you to fill out forms in offline mode on a mobile device  
  • Offline mode works like your email outbox.  It holds onto the data until there is an internet connection
  • Mike's theory is that if you show a company how to collect data with a simple form, they will see the value of the solution & be inspired to act on building solutions for their other problems
  • Tip: make data collection as simple as possible.  Don't build complicated forms
  • Nintex Workflow also has the functionality to generate contract documents using the data captured within online forms
  • Nintex Workflow can use Docusign to sign said auto-generated contacts as well!
My Musings:
  • Using Nintex Forms across multiple devices requires you to build multiple templates.  Which is fine until an update to a form needs to be rolled out across all devices.  Not a single form template that is responsive across all devices.
  • Can't believe Mike refused to click the 'update' button on his office suite mid-session! ;)
  • +1 for telling the Stone Soup story.
Rating: 4/5 Stone Soups

Reasoning:  Despite the projector difficulties at the start, Mike was a cool, calm & humorous speaker that gave simple examples of how to collect data across multiple devices using a single tool, Nintex Forms & Workflow.

I was personally hoping for a little more on the 'Inspired Action' part of the session (e.g. how do you convince a company to act on the data they collect).  My experience has shown the 'build it & they will come' mantra is true, but inspiring the business to utilise that data & act upon it does not happen without a lot of hand holding.

My understanding is Mike would have gone into further detail had he had more time, but that's the only reason I couldn't give this session full marks!

Agree or Disagree?  Please feel free to discuss your thoughts in the comments below!

Thursday, 25 February 2016

AvePoint DocAve 6 - How to Fix the Error "The timer service is down"

Logged into DocAve today to move some content from one site to another, only to come across this error as soon as I logged in:
"The timer service is down, which may cause the manager service stop working.  Please ensure your timer service is started."

My first thought: Don't care, as long as I can still complete my task.  So went to Content Manager, tried to expand my farm in the tree-view, only to get this error!
An error occurred while loading the data.  Please view the logs for details.

I'm the kind of man that uses Logs as a last resort, so here's how I fixed it:

Logged onto the server that is hosting the DocAve 6 Manager, then opened up the 'Manager Restart Service Tool' for DocAve from the Start Menu & restarted all three services:



Once they restarted, tried logging back into DocAve, but turns out one of my Server Agents was still down:
 View of Agent Monitor which can be found by navigating to Control Panel > Agent Monitor in DocAve 6.

These agents are what gets installed on each Farm to action tasks you make in DocAve.  So then I logged into the Server (Agent Name) that had the stopped agent.  Once there, ran the Agent Restart Service Tool & all was fixed.

Anyone else have DocAve issues they need help solving?

If you enjoyed this, here's another post about resolving a DocAve issue I wrote a little while back:

Monday, 15 February 2016

The Ultimate Reporting Solution Using SharePoint Task Lists

Preamble 
------------------
We've all done it before, built a task list, exported SharePoint list data to excel, created a pivot table & chart to show status in each column.  Below is a quick example of what you can get by doing something simple like that.  It's great for getting a snapshot of the task list, but terrible for reporting on team performance.

export to excel


Pivot-table & chart of a task list


What 
------------------
Reporting isn't just about showing stats on how your tasks are tracking.  Sure, it gives you an idea of what you have achieved over a set period of time which is great information for upper management.  But it doesn't help you improve your customer experience.

  • What if you could develop an automated report that could track every task individually?  
  • What if you could see how long a particular task sat at a particular status?  
  • What would happen if you found out that tasks spend most of their time in the 'On Hold' status?

I know what would happen.  You would now be able to find all the bottlenecks in your process & start to resolve them one at a time.  You would be able to see which staff perform better during certain phases of a task & you could fine tune your team into a well-oiled task destroying machine.


Why
------------------
I just told you.  By implementing this solution are getting performance monitoring down to a granular level which allows you to surface bottlenecks in your process and sort that shit out.


How
------------------
I'm going to attempt to explain how to achieve this via diagrams & process maps because the step by step process would be slightly long!
  • Create two lists. a Task List, used for logging each task and it's status.  and a Task Logging List, used to hold all the logs for when tasks are updated.  Here's a picture of the columns you need to include in each list



  • Create a Workflow on your Task List that will run every time the status of a task changes. Here's a picture of the workflow process I went with:
View of workflow & trigger actions:



Detailed view of workflow & each step that occurs at each stage:


  • Export the Data to Excel & create a Pivot Report
Here you can see a VERY basic excel report that is pulling back all the data we have been logging to the Task Logging List.  It shows on average how long a job/initiative sits in a status before being moved to the next status.  You can then filter/slice this data to show how long a specific initiative or task owner takes on average to complete a task at each status.



References
------------------
I'm not covering any new ground, this has been drilled into us again and again.  I'm just trying to deliver what's been offered previously in a more step-by-step approach.  Here's where I particularly enjoyed reading about it:

PROVEIT! - Using Analytics to Drive SharePoint Adoption and ROI (Published by Mark Miller, Edited by Loren Johnson)
 - In Particular, Chapter 4 (SharePoint Analytics) by Sadalit (Sadie) Van Buren

Monday, 25 January 2016

Nintex Workflow - How To Set a DateTime field to Current Date AND Time

What: Surprisingly had some trouble with this simple task, so here's how you can avoid wasting 20 minutes of your life.  If you have a list column that is of type Date AND Time, it can be difficult to set it to the current date and time inside a workflow.

Why:  You might like to do this if you were logging changes to items to a separate list for reporting on later.

How (quick): Create a string variable called 'CurrentDateTime', set the string variable to equal 'CurrentDate[space]CurrentTime'.  Set your DateTime list column to equal the workflow variable CurrentDateTime.

How (detailed):
  • Create a Workflow Variable called 'CurrentDateTime' of type 'Single line of text'
  • Create a 'Set Variable' step and set CurrentDateTime to equal value: Current Date[space]Current Time
    (these two values can be found under common variables tab).



  • Update the field on the list item to equal the Workflow variable you just set.  In my case, I was updating my DateTime field called End Time to equal CurrentDateTime variable.

Monday, 11 January 2016

How To Set Up a Personalised Shortcuts List on a SharePoint Site

What is this?  A tutorial on how to set up a cool list on SharePoint where staff can manage their favourite links, ideally on the homepage of your intranet.

This keeps all their commonly accessed web-stuff 1 click away, and it means you do not have to fill up your SharePoint navigation with 100's of useless links that only 5-10 people use.

Woah that sounds sweet, how is that even possible!?  Well I'm going to show you how, in this tutorial we are using SharePoint Online, because then this post will be relevant for more than a year.

Step 1:  Create a Custom List called 'Personal Shortcuts' by clicking Settings > Add an app, and selecting 'Custom List'.


Step 2: Create a new column in your new list by clicking the List Tab > Create Column.  Call the new column 'Shortcut', Set the Type as 'Hyperlink or Picture' & make sure the column requires a value.


Step 3: Now we need to remove the Title column from this list.

  • Navigate to List Tab > List Settings

  • Set Advanced Settings > Allow management of content types: Yes
  • In List Settings, you should now see a Content Types section.  Click on the 'Item' link

  • Click on the Title Column, set to Hidden (Will not appear in forms)

Step 4: Create a Personalised View of the list

  • Go back to your list & click List Tab > Create View > Standard View & set it up as follows
    • View Name: My Shortcuts
    • Only display the 'Shortcut' Column
    • Sort by: Shortcut
    • Filter: Where 'Created By' is equal to [Me]
    • Click OK
Now it's time to put the personalised list on a page.  So navigate to your homepage and follow these steps ;)

Step 5: Edit page & add an App Part

  • Click Settings Cog > Edit Page

  • Click inside one of the squares on the page and click Insert Tab > App Part > Personal Shortcuts  and then Add


Step 6:  Remove App Part toolbar & header
  • In the top right hand corner of the App Part, there is a little down-arrow.  Click it, then click Edit Web Part

  • Choose the following settings then Apply & OK
    • Selected View: My Shortcuts
    • Toolbar Type: Summary Toolbar
    • Appearance > Chrome Type: None
  • Save Page.

Step 7: Using the list.  You should now have a cool Personalised Shortcuts Web Part on your homepage where people can create their own shortcuts and no one else can see them!!  Don't forget to make sure Everyone has Contribute permissions on the list.

This was initially developed to help with people trying to manage their global navigation, if you haven't read it yet, take a look at my previous post: What Should be Allowed to go in Global Navigation

How did you go?  All good?  Got some additional tips?

Friday, 8 January 2016

SharePoint - What Should Be Allowed to go in Global Navigation?

I'll make this real easy.  IF EVERY SINGLE USER NEEDS IT, then it can go on global navigation.

Otherwise, you're wasting precious navigation space for links nobody wants.

Still really need a selection of staff to have one-click access to something?  That's fine, you should look at implementing a personalised list of shortcuts on the homepage that each user can manage themselves.  That way that specialised safety system they access everyday takes up their screen space and no one else's.


This is almost a golden rule for me, what're your thoughts?

Wednesday, 6 January 2016

The Best OOTB Cross-Site Collection Navigation Solution for SharePoint Online

I will start by saying:  This solution sucks, but I've done my fair share of research/testing/swearing so you don't have to.  This is the best option you can currently achieve with OOTB (Out-of-the-box) functionality.

Problem:  Many large companies moving to SharePoint Online have the same problem.  They have enough data that it needs to be spread out across multiple site collections.  How the data should be split up is a different story .  The fact is, they would like to have consistent Global Navigation across all site collections.

Reasons why you would want the same global navigation across all site collections: 

  • Visibility of everything that exists within the SharePoint Online Tenant
  • Consistent navigation simplifies the User Experience, allowing them to be comfortable in any Site Collection without having to remember a new navigation
  • Everyone knows everything that is on SharePoint, not just the admins managing the tenant, which in turns reduces duplication of content
  • One less thing for Site Collection Admins to manage

Rebuttal:  Some argue that there is no need to have the same navigation across all site collections because Search & Content Search Web Parts can surface all the content across the tenant anyway.  Yes that is true, but I would argue that being presented with content, and knowing where content is located are two very different things.

Finding content quickly allows you to get what you need and get on with your day which is great for short-term productivity & efficiency.  However, knowing where content is located helps users keep content up to date, allows easier management of access to the content & makes sense to people when they ask 'so where is this actually sitting?'.

The Solution:  Utilise the SharePoint Term Store to manage your global navigation & set all your site collections to use Managed Navigation.

How it works:  You create one main navigation Term Set and set up all the terms (navigation options/dropdowns) you would like to have in your global navigation.  This Term set will be used by your Root Site Collection (http://portal.sharepoint.com).

You then create one additional term set for each site collection you manage.  Each of these term sets will use 'pinned terms with children', which replicate all the settings from the main navigation Term Set without you having to recreate them all manually.

This means if you ever need to edit things like, location of term in navigation, or name of term, then it will automatically roll out that change to all your pinned term sets.

Disadvantages to this solution:  here's where the sucky part comes in.

  • Initial setup takes a long time.  lets say you have 20 site collections and 20 items in your global navigation, this means you would need to create 20 terms, then pin each of those 20 terms to 20 site collections (400 terms all up).  That's a shitload of work (1 day for a pro like myself).
  • If you change a URL to a root term, it doesn't roll out that change to all of your term sets, you would need to manually update the URL in each of the term sets
  • If you need to add a new term, same URL rules apply I'm afraid.

Still on my side and want to implement this bad boy?  Move on to my next blog post for 'SharePoint Online - Setting up Cross-Site Collection Navigation Using Term Sets [work in progress]'

I'm always looking for better ways to manage SharePoint environments, so if you've got anything to add on global navigation, please comment below!