Author Archives: petbo

About petbo

I am a passionate SharePoint Solution Architect since SharePoint 2007.
Together with my team @IF-Blueprint I am working on constant improvements to the business world.
I love challenging tasks and beautiful solutions that people give me credit for.

Work Management in SharePoint 2016

 

 

Hi Folks,

As you all remember the well known productivity feature Work Management Services in SharePoint 2013. Well, let me drop the bomb. Work Management Services is no longer with us in SharePoint 2016. As Microsoft published in September 2014, Tasks (Work Management) got removed from Office 365. I could not find the official announcement anymore, but it is referenced here (The “Sync to Outlook” button and the “Tasks” link are missing in SharePoint Online)

As you all noticed earlier this month, Microsoft made SharePoint 2016 RTM officially available to download and trial. Central Administration

I noticed that Work Management Service got removed from the SharePoint 2016 Central Administration > Manage Service ApplicationsNew menu.

 

So I tried PowerShellWork Management PowerShell

Here is the result. I did not find any official record, and it is not in the What’s deprecated or removed from SharePoint Server 2016 list (This list is dated March 11, 2016 and it applies to the SharePoint 2016 Preview).

So in case you relay on Work Management Service in SharePoint 2013, be warned that there is no more in SharePoint 2016. It will properly be integrated in Exchange Server or maybe there is going to be a Planner on-premise version coming up.

Cheers!

Newsfeed Insights

SharePoint Newsfeed Insights

Newsfeed InsightsOne of my clients who is using SharePoint 2013 Sitefeeds extensively in his new social intranet asked me to build ‘something’ to get some insights out of the Social feeds.
So I went and build a little demonstration just to get the following insights out of a SharePoint Site Newsfeed.

  • total number of posts
  • total number of replies
  • total number of likes

I wrote the following peace of JavaScript code to get to the JSON response of a Newsfeed. From there it is just a matter of digging through the structure of the data object.

<html>
  <head>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js" />
    <script>
      var siteUrl = _spPageContextInfo.webAbsoluteUrl;
      var url = "/_api/social.feed/actor(item=@v)/feed(MaxThreadCount=10000)?@v='" + siteUrl + "/newsfeed.aspx'"

      $.ajax({
        url: url,
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        dataType: 'json',
        success: function (data) {}, 
        error: function (data) {}
      });
    </script>
  </head>
  <body> 
  </body>
</html>

Here are a couple of examples on what to find were in the JSON Response

Total number of posts
data.d.SocialFeed.Threads.results.length

number of replies of a single post
data.d.SocialFeed.Threads.results[0].TotalReplyCount

number of likes of a single post
data.d.SocialFeed.Threads.results[0].RootPost.LikerInfo.TotalCount

number of likes of a single reply of a post
data.d.SocialFeed.Threads.results[0].Replies.results[0].LikerInfo.TotalCount

Here is the complete JavaScript code of my demo. You can use it in SharePoint WebParts, Add-Ins, Apps, or just put the js file in the Site Assets library and use it in a CEWP (Content Editor Web Part)

<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"/ >
<script>
 var siteUrl = _spPageContextInfo.webAbsoluteUrl;
 var url = "/_api/social.feed/actor(item=@v)/feed(MaxThreadCount=10000)?@v='" + siteUrl + "/newsfeed.aspx'"
 $.ajax({
   url: url,
   method: "GET",
   headers: { "Accept": "application/json; odata=verbose" },
   dataType: 'json',
   success: function (data) {
     if (data.d.SocialFeed.Threads != null) {
       var results = data.d.SocialFeed.Threads.results;
       var numberOfPosts = 0, numberOfReplys = 0, numberOfLikes = 0;
       numberOfPosts = results.length;
       for(var i = 0; i < numberOfPosts; i++) {
         numberOfReplys = numberOfReplys + results[i].TotalReplyCount;
         numberOfLikes = numberOfLikes + results[i].RootPost.LikerInfo.TotalCount;	
         for(var j = 0; j < results[i].Replies.results.length; j++) {
           numberOfLikes = numberOfLikes + results[i].Replies.results[j].LikerInfo.TotalCount;	
         }					
       }

       document.querySelector("#socialThreadStats .sts-posts").innerHTML = numberOfPosts;
       document.querySelector("#socialThreadStats .sts-replys").innerHTML = numberOfReplys;
       document.querySelector("#socialThreadStats .sts-likes").innerHTML = numberOfLikes;
     }
 	else {
 	   document.getElementById("socialThreadStatsStatus").innerHTML = "No Newsfeed found in this web please check configuration"
 	}  
   }, 
   error: function (data) {}
 });
</script>
<style>
  #socialThreadStats {
    display: table;
    padding-top:20px;    
  }
  #socialThreadStats ul {
    display: table-row;
    height: 50px;
    vertical-align: bottom;
  }
  .sts-stat-header {
    display: table-cell;
    width: 120px;
    height: 50px;
    font-size: 16px;
    border-bottom: 2px solid lightgrey;
  }
  .sts-stat-value {
    display: table-cell;
    width: 106px;
    height: 50px;
    font-size: 36px;
    text-align: center;
    border-bottom: 2px solid lightgrey;
  }
</style>
</head>
<body>
  <h1>What´s happening</h1>
  <div id="socialThreadStats">
    <ul>
      <li class="sts-stat-header"><span class="sts-posts-Text">Posts: </span></li>
      <li class="sts-stat-value"><span class="sts-posts"></span></li>
    </ul>
    <ul>
      <li class="sts-stat-header"><span class="sts-replys-Text">Replies: </span></li>
      <li class="sts-stat-value"><span class="sts-replys"></span></li>
    </ul>
    <ul>
      <li class="sts-stat-header"><span class="sts-likes-Text">Likes: </span></li>
      <li class="sts-stat-value"><span class="sts-likes"></span></li>
    </ul>
  </div>
  <div id="socialThreadStatsStatus"></div>
  </body>
</html>

There is also a really good MSDN documentation on social feeds in SharePoint I want to share with you. https://msdn.microsoft.com/en-us/library/office/dn155789.aspx

UPDATE:

I updated the script to be able to get more than the default 20 threads.
You can use the ‘MaxThreadCount’ Property of the feed to get more threads. I set it in the example to feed(MaxThreadCount=10000) to get up to 10000 threads back. A thread is a post in the newsfeed. This does not count for Replies.

Color palettes and fonts in SharePoint 2013

Today I want to talk just a little bit about designs in SharePoint 2013. You should know that I am not one of the greatest Web Designers and I believe I was never meant to be one of them. But Microsoft made it very easy to get your own corporate look and feel in SharePoint 2013 by just adjusting the color palettes and fonts. It’s not a full-blown design but its maybe just right for some of you.

But still it was just a bunch of hexadecimal color codes in an XML formatted file which looks like the following.

<?xml version="1.0" encoding="utf-8"?>
<s:colorPalette isInverted="false" previewSlot1="BackgroundOverlay" previewSlot2="BodyText" previewSlot3="AccentText" xmlns:s="http://schemas.microsoft.com/sharepoint/">
    <s:color name="BodyText" value="444444" />
    <s:color name="SubtleBodyText" value="777777" />
    <s:color name="StrongBodyText" value="262626" />
    <s:color name="DisabledText" value="B1B1B1" />
    <s:color name="SiteTitle" value="262626" />
    <s:color name="WebPartHeading" value="444444" />
    <s:color name="ErrorText" value="BF0000" />
    <s:color name="AccentText" value="FF0000" />
    <s:color name="SearchURL" value="338200" />
    <s:color name="Hyperlink" value="0072C6" />
    <s:color name="Hyperlinkfollowed" value="663399" />
    <s:color name="HyperlinkActive" value="9B0000" />
    <s:color name="CommandLinks" value="666666" />
    <s:color name="CommandLinksSecondary" value="262626" />
    <s:color name="CommandLinksHover" value="FF0000" />
    <s:color name="CommandLinksPressed" value="9B0000" />
    <s:color name="CommandLinksDisabled" value="B1B1B1" />
    <s:color name="BackgroundOverlay" value="D8FFFFFF" />
    <s:color name="DisabledBackground" value="FDFDFD" />
    <s:color name="PageBackground" value="FFFFFF" />
    <s:color name="HeaderBackground" value="D8FFFFFF" />
    <s:color name="FooterBackground" value="D8FFFFFF" />
    <s:color name="SelectionBackground" value="7F9CCEF0" />
    <s:color name="HoverBackground" value="7FCDE6F7" />
    <s:color name="RowAccent" value="FF0000" />
    <s:color name="StrongLines" value="FF9696" />
    <s:color name="Lines" value="ABABAB" />
    <s:color name="SubtleLines" value="C6C6C6" />
    <s:color name="DisabledLines" value="E1E1E1" />
    <s:color name="AccentLines" value="FF3939" />
    <s:color name="DialogBorder" value="F0F0F0" />
    <s:color name="Navigation" value="666666" />
    <s:color name="NavigationAccent" value="FF0000" />
    <s:color name="NavigationHover" value="FF0000" />
    <s:color name="NavigationPressed" value="9B0000" />
    <s:color name="NavigationHoverBackground" value="7FCDE6F7" />
    <s:color name="NavigationSelectedBackground" value="C6EFEFEF" />
    <s:color name="EmphasisText" value="FFFFFF" />
    <s:color name="EmphasisBackground" value="FF0000" />
    <s:color name="EmphasisHoverBackground" value="C60000" />
    <s:color name="EmphasisBorder" value="C60000" />
    <s:color name="EmphasisHoverBorder" value="9B0000" />
    <s:color name="SubtleEmphasisText" value="666666" />
    <s:color name="SubtleEmphasisCommandLinks" value="262626" />
    <s:color name="SubtleEmphasisBackground" value="F1F1F1" />
    <s:color name="TopBarText" value="666666" />
    <s:color name="TopBarBackground" value="C6EFEFEF" />
    <s:color name="TopBarHoverText" value="333333" />
    <s:color name="TopBarPressedText" value="9B0000" />
    <s:color name="HeaderText" value="444444" />
    <s:color name="HeaderSubtleText" value="777777" />
    <s:color name="HeaderDisableText" value="B1B1B1" />
    <s:color name="HeaderNavigationText" value="666666" />
    <s:color name="HeaderNavigationHoverText" value="FF0000" />
    <s:color name="HeaderNavigationPressedText" value="9B0000" />
    <s:color name="HeaderNavigationSelectedText" value="FF0000" />
    <s:color name="HeaderLines" value="ABABAB" />
    <s:color name="HeaderStrongLines" value="FF9696" />
    <s:color name="HeaderAccentLines" value="FF3939" />
    <s:color name="HeaderSubtleLines" value="C6C6C6" />
    <s:color name="HeaderDisabledLines" value="E1E1E1" />
    <s:color name="HeaderDisabledBackground" value="FDFDFD" />
    <s:color name="HeaderFlyoutBorder" value="D1D1D1" />
    <s:color name="HeaderSiteTitle" value="262626" />
    <s:color name="SuiteBarBackground" value="FF0000" />
    <s:color name="SuiteBarHoverBackground" value="FF6464" />
    <s:color name="SuiteBarText" value="FFFFFF" />
    <s:color name="SuiteBarDisabledText" value="FF9696" />
    <s:color name="ButtonText" value="444444" />
    <s:color name="ButtonDisabledText" value="B1B1B1" />
    <s:color name="ButtonBackground" value="FDFDFD" />
    <s:color name="ButtonHoverBackground" value="E6F2FA" />
    <s:color name="ButtonPressedBackground" value="FF9696" />
    <s:color name="ButtonDisabledBackground" value="FDFDFD" />
    <s:color name="ButtonBorder" value="ABABAB" />
    <s:color name="ButtonHoverBorder" value="FF9696" />
    <s:color name="ButtonPressedBorder" value="FF3939" />
    <s:color name="ButtonDisabledBorder" value="E1E1E1" />
    <s:color name="ButtonGlyph" value="666666" />
    <s:color name="ButtonGlyphActive" value="444444" />
    <s:color name="ButtonGlyphDisabled" value="C6C6C6" />
    <s:color name="TileText" value="FFFFFF" />
    <s:color name="TileBackgroundOverlay" value="7F000000" />
    <s:color name="ContentAccent1" value="FF9339" />
    <s:color name="ContentAccent2" value="C65A00" />
    <s:color name="ContentAccent3" value="24A0A0" />
    <s:color name="ContentAccent4" value="007777" />
    <s:color name="ContentAccent5" value="2FCF2F" />
    <s:color name="ContentAccent6" value="009E00" />
</s:colorPalette>

And to be honest I do not see the colors behind a six-digit hexadecimal code … yet!
And I think I want to keep it like that.

But today, a dear colleague of mine showed me how easy it can be to get started in less than 10 minutes when you have the right toolset which in this case is provided by Microsoft itself.

Here is what he showed me:

Download the SharePoint Color Palette Tool from the Microsoft Download Center here.

SharePointColorPaletteTool

The tool is easy to handle and self-explaining. (Feel free to contact me if you have questions)

You can use one of the many tools out there to create a color scheme.
We used http://paletton.com in this example.

Just put the hexadecimal color codes into your SharePoint Color Palette and save the file.

Now you can upload the *.spcolor file to SharePoint manually or you use a SharePoint App to deploy the file to SharePoint. Chis O’Brien explained the second way in his blogpost SP2013 host web apps: provisioning files (e.g. master pages) to the host web.

Unfortunately there is no editor for for the *.spfont files. But you can use your own fonts in SharePoint 2013 by providing a custom .spfont file. For more Information about both file types take a look at the MSDN article Color palettes and fonts in SharePoint 2013