Semantic Versioning for SPServices?

Late last year I committed to put SPServices onto Github to encourage greater collaboration and contribution from the community. It’s definitely there now, and there are several things I’ve been struggling with since I moved it there:

  • What to name each version
  • How many versions to move into the repo
  • Whether it actually will increase community submissions at all
  • etc.

So far, I have done one release while SPServices has been on Github, which was 2014.02 [Codeplex][ [Github]. Even for that one new release, I wasn’t sure how to structure things. Everyone is moving away for including version numbers in their file names. I’m not sure that’s such a good thing. By including the version number in the file name, we can tell – at a glance – what version we’re working with. Since many SPServices users are more on the end user end of the spectrum rather than the developer end, that’s an excellent thing to be able to do.

Andreas Schultz has recommended that I switch to Semantic Versioning in a pull request for bower.json. Bower is a package manager, and there are a host of others: npm, NuGet, Bower, Ender, volo, component, Jam, and the list goes on. The number of these things is increasing fast. (I’d include links, but these things are easy to find.)

This is a tricky one. I’ve watched as this “semantic versioning” thing gets rolling, and I’m not sure how I feel about it.

Over the first several years I increased the versions for SPServices from 0.2.3 to 0.7.2. The fact that I wasn’t getting to version 1.0 was more me being cantankerous than anything else. Then I had 3 or 4 people tell me – separately – that they weren’t allowed to use software in their organizations unless it was version 1.0 or above. What a crock!

So I switched to numbering like 2013.01 back in May, 2013. The version is greater than 1.0! Since then, I’ve had 2013.02, 2013.02a, 2014.01, and 2014.02. It marches forward and gives some indication of what the versions is, or at least its age.

Semantic versioning seems to give people an excuse to introduce breaking changes. Here’s the summary of the idea from the SemVer site:

Given a version number MAJOR.MINOR.PATCH, increment the:

  1. MAJOR version when you make incompatible API changes,
  2. MINOR version when you add functionality in a backwards-compatible manner, and
  3. PATCH version when you make backwards-compatible bug fixes.

Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.

One of my goals with SPServices going way back to 1999 has been not to introduce *any* breaking changes. I think I’ve done a pretty good job on that, too. Whether you’re using SPServices on SharePoint 2007 with no updates installed or SharePoint 2013 on Office365, it *ought* to work the same way. Code that you wrote with version 0.2.3 *ought* to still work, too, though most likely you’re running a more recent version of jQuery and other things which would make using that ancient version pretty dumb. (That and the fact that the first version didn’t do much.)

If I were to follow the semanatic versioning rules, I’m not sure if I would be at 1.1.14 or 1.14.02 or what. Removing version numbers from files makes me uncomfortable, though.

Switching to semantic versioning seems to be hopping on a train without really understanding if driving is just fine and will get us there at the same time. What are your opinions on this? If you add your $.02 into the comments, please indicate what type of user you are, e.g., end user (“I paste SPCasecadeDropdowns into my forms” or developer “I write solutions using SPServices as the data transport layer” or…


The Year That Will Be: 2015

It’s that time of year when people tend to look back at the prior year or look forward to the new one. In my case, I’m generally choosing to look forward. 2014 was a swell year on most counts, but I’m really looking forward to 2015.

I’m excited about a number of things coming up this year, and I wanted to tell you about some of them.

My 5th Microsoft MVP Award

Yesterday morning I learned that I received my fifth Microsoft MVP award. As it is each time, it’s an incredible honor to be put in the company of such talented people. The MVP program lets me spend time with some of the brightest and most motivated SharePoint / Office365 people on the planet.

Sympraxis Consulting LLC

Sympraxis LogoMany of you who know me may not be familiar with Sympraxis Consulting LLC. It’s my own little company that I started when I went out on my own (sort of; see below). 2015 promises to be a transition year for my little company. (One resolution I should probably make is to come up with a better Web site than the WSS3-based one I’ve had limping along for the last six years!) Back in 2008, my buddy Pete Sterpe (@petesterpe) and I started Sympraxis together with big dreams. The Fall of 2008 seemed like such a great time – not. Sadly, due as much to the economy as anything else, Pete realized about a year in that he needed a more solid paycheck to fit his life goals at the time.

Luckily for me, Pete is rejoining me at Sympraxis. I’ve known Pete since 1996, when we worked together at Renaissance Solutions. Renaissance focused on knowledge management and performance enhancement by utilizing technology and the Balanced Scorecard. You may know better now where some of my rhetoric comes from. (Sadly even the Way Back Machine doesn’t have a good snapshot of Renaissance from those times, though it does have one of the successor company, Renaissance Worldwide.)

Pete will be ramping back up with Sympraxis as his existing work ramps down, and I am delighted to have him back. He’s one of the sharpest people I’ve ever worked with and our business ethics are perfectly attuned. I hope you get a chance to meet Pete in the near future. You can check out his blog to get to know him a little bit. Since he never changed his About page, you can read how he started Sympraxis with me!


I’ve got two nascent partnerships I’m working on that I’m very excited about. I’ve written about them before but I wanted to go over them here again.

Seven Sigma / Glyma

Seven SigmaThe first relationship is with the folks at Seven Sigma down in Perth Australia. Paul Culmsee (@paulculmsee) and Chris Tomich (@christomich82) are two of the smartest folks I know in SharePoint land. It turns out that we’ve been admiring each other from afar for a long time. If they weren’t all the way around the planet in Perth, I’m sure we would have worked together sooner. I was lucky enough to meet both of them when I was down in Australia at ShareThePoint‘s 5th Annual Australian SharePoint Conference in Sydney last July. (It’s a great conference if you are anywhere near there for the next one.) We talked about the fact that it would be great to work together in some way and we’re still trying to figure out exactly how that might work. It will be something we’re both convinced will add value and as the partnership starts to gel I think it’s going to be an exciting thing to work together.

Their Glyma product really gets the knowledge management part of me excited. Using the concept of dialog mapping, it’s a fantastic way to encapsulate and map the knowledge contained within an organization as well as a way to help map strategic focus and direction decisions. Watch for more about Glyma from me in the weeks and months ahead.

Dynamic Owl / Bonzai Intranets

DynamicOwlLogoThe second relationship is with my friends at Dynamic Owl in Vancouver, BC, Canada. Dynamic Owl is headed by Michal Pisarek (@michalpisarek) and he has a small group of incredibly intelligent folks working with him. Michal and I have talked about ways we could work together over the years, but have never come up with something that makes sense.

Bonzai IntranetThe Owls’ product is called Bonzai Intranet and I’m incredibly impressed with what Matthew Carriere (@matthewcarriere) and Shereen Qumsieh (@msshushu) have built in a very short time. They’ve taken the learning that they have over the years working in SharePoint and built some of the most common things that they’ve seen time and time again in customer Intranets. The most impressive thing about it to me is the architecture. The majority of the functionality is driven from the client side using AngularJS and calls to CSOM and REST. I’ve been working with them to think through how their architecture might work with Office 365. As we all know there are some different challenges there, but with a bit of good thinking ahead of time I think they are going to be able to do some amazing things.

I’m not exactly sure where these two relationships will lead, but I’m hoping it will go far beyond just pasting each others’ logos into our Web sites. These are great people with whom I hope to work a lot more in 2015.


SharePoint – and by extension – Office365 – would never be what they are without the incredibly strong community around them.

IT Unity Webinar: #CollabTalk, The Show

ITUnityLogoI’m joining an impressive crew of people to do a new video series on IT Unity. Many of you have probably participated in the #CollabTalk tweet jams that have been going on for the last couple of years. Tweet jams are great, but of course they only have a certain utility since we can type just 140 characters at a time. With this new video series hosted by IT Unity, Christian Buckley (@buckleyplanet), Naomi Moneypenny (@nmoneypenny), Benjamin Niaulin (@bniaulin), and I will be able to go into much more depth about topics that we think are important to people who are interested in Office365. I think we will have a lot of fun and talk about some really important topics at a level of depth that we could never do in a tweet jam.

CollabTalk - Tiny - Tiny


I love speaking at conferences. I learn so much talking about what I do with attendees and getting to go to other speakers’ sessions is the icing on the cake. I used to always say I’d like to teach some day, and this is my way of doing a bit of it on a regular basis.

In 2014 I was fortunate to speak at ShareThePoint’s conferences in Sydney and Auckland, which was my first chance to visit that side of the world. We made it into a family trip to Vietnam and Cambodia, so it was quite the globe-trotting romp. (Don’t look at a globe and tell me how ridiculous that was; I know.)

There were lots of other great conferences, too: SEF in Stockholm, Sweden; SPTechCon in San Francisco and Boston; and SharePointFest in Chicago, just to name some of the most prominent ones.

This year I already have SPTechCon in Austin, TX lined up, along with SharePoint Evolution in London. If you’re dying to keep up with where I’ll be, watch the Speaking page here.

Oh, and Clients!

I’ve been very lucky to have some wonderful clients who have engaged me multiple times over the years. As is always my hope, with most of them I have a long-standing, open and honest relationship. Along with all the fun stuff above, I do occasionally focus on earning a living, and my clients are the best. Here’s to a lot of great projects in 2015!


blackshadesYeah, it may be true. The future may be so bright I’ve gotta wear shades. I don’t mean this in a gloating way by any means. I’m incredibly lucky to be in the position I’m in at this point in my career. For many reasons which I won’t go into here, my time in the sun seems to be in my 50s. Many of my contemporaries may be able to rest on their laurels at this age, having accomplished their world-changing stuff in their 20s or 30s. I’m excited to know that my time is now or may be yet to come. I can’t wait to see what else 2015 has in store for me. Happy New Year!

Create a Simple SharePoint 2013 Employee Directory on Office365 – Part 2 – Set up an Employee Directory Page

The first step is, of course, to create a page where the Employee Directory will live. The approach we’re taking here is to use a page in the Search Site Collection in Office365. By default – at least in the tenants I’ve worked with – the Search Site Collection lives at https://[tenant name] This isn’t a sneaky hidden Site Collection like the ContentTypeHub (See: Hidden Content Type Hub on Office365 Tenants), but one that lives right out in the open.

When you go to the Search Site Collection directly, you’ll land on a very bland search page:

Search home page

You may also have created your own Enterprise Search Center, which may look a little different. It doesn’t really matter, though. All we want to do is to create a new page in the Search Site Collection you are using to house the Employee Directory.

Click on the cog (See the cog on the left as of this writing. It’s not unlikely that it’s taken on a new shape or color since then.The Cog) and then Site Contents. This should show you all of the Apps lists and libraries available in the Site Collection root. If you can’t get this far, then you may not have the appropriate permissions. Go directly to Jail, do not pass Go, and do not collect $200. You’ll need to talk to your Tenant or Site Collection Administrator to get the right permissions.

If permissions aren’t a problem, then click on the Pages App Library icon.

Pages Library

Once in the Pages library, go to the ribbon and create a new page.

Add a new page

When you select Page, you’ll end up on the page where you can create the page. What you’re looking for here is the “(Welcome Page) Search People” page layout. In the image below, the page layout is not available. If it is, choose it and keep rolling. If not, first take this little detour.

Choose Page LayoutClick on the cog, go into Site Settings, and choose “Page layouts and site templates” under the “Look and Feel” section at the top of the right column. (For some reason, even when I know where something is on this page, I have a tough time spotting the right link: everything looks the same. My trick is to use Ctrl-F in the browser to search for the right word rather than just scanning for it.)

Page layouts and site templates

In the Page Layouts section, add the “(Welcome Page) Search People” page layout.


Enable a page layout

The section should then look like this:

Enable a page layoutNow go back to the Pages library and create a new page. I’m calling mine “Employee Directory” with the URL set to Employee-Directory.aspx. Be sure to choose the “(Welcome Page) Search People” page layout.

Create Employee Directory page

When you click Create, you’ll end up back in the Pages library. Click on the Employee Directory page. It’ll look something like this, though if you see my photo it’ll be a little weird.

Employee Directory - CreatedBelieve it or not, you now have a fully functional page that will do much of what you want. For instance, if you type “Lastname:A*” in the search box, you’ll get all of the people whose last name starts with the letter A.

Lastname:A*But we don’t want to land on the page with nothing showing. That would require more work than we want people to do. Instead, let’s set the Search Results Web Part up so that it shows some of the people in the tenant by default.

Click on the cog and Edit Page. If you’ve never done this on a Search Results page before, you may be surprised to realized that it’s just a Web Part Page with some special Web Parts already set up for you. You’ll see that you have two Web Part Zones.

  • On the left, you have the Navigation zone. It contains only one Web Part: the Refinement Web Part
  • On the right, you have the Main Zone. It contains two Web Parts: the People Search Box Web Part and the People Search Core Results Web Part.

Employee Directory in edit mode
Click on the dropdown at the top right of the People Search Core Results Web Part and choose Edit Web Part. This will open the Tool Pane for the Web Part.

People Search Core Results Web Part Tool PaneThere’s a great deal we can do with these settings, but for now we are going to just do one simple thing. Click on the Change Query button. In the Query text box, simply add contentclass=spspeople. This sets the default search to return all people, filtered by whatever is in the search box. If you click the Test query button, you should see at least a few people show up on the right in the Search Result Preview box.

Checnge query to search for peopleClick OK to save the query, OK to save the Web Part settings, and Save on the ribbon to save the page. Now you should have a very rough first pass at an Employee Directory. You should see up to 10 people in the results, perhaps along with a photo (if they have one in their profile) and a little information about each person (if certain profile properties are populated). You my also see some strange “people-like” entities. These will usually be some crawler accounts, etc. We’ll take care of those later.

OOB People Search ResultsWhew. That’s probably enough for now. If you want to, try adjusting some of the settings in the Tool Pane for the People Search Core Results Web Part, but don’t go too crazy. In the next post in this series, we’ll look at how we can make some changes to the Display Templates so that our results are more helpful and robust.

Note: Mikael Svenson (@mikaelsvenson), my search guru and Jedi master, pointed out to me that adding contentclass=spspeople isn’t actually necessary. Once we have some other criteria in the search query, we won’t need it there. However, at this point since we don’t, and we’d like to see some people in the results, it serves a purpose.

Don’t Use a Query String Parameter Called ID Unless You Mean the Item ID

The other day I got a question from my pal D’arce Hess (@DarceHess):

I am using jsLink on a couple lists and I have an interesting circumstance I’m running into.

Scenario: I have a list of Work Centers and each work center has associated machines that are in another list.

I’m having an interesting situation that when I click on the link in the Work Center, it is supposed to reload the same page and append the Work Center ID to the url  so that it will load the associated machines in the other list. I have the functionality working, however for some reason, when it adds the ID and reloads the page, it is changing the page layout from the layout that is chosen for the initial .aspx page.

Since it is literally re-loading the same page, just with an additional ID, I’m not creating new pages. Any ideas of what may be causing this?

After some back and forth about it, I realized that D’arce was using a query string parameter named “ID”. (I know, it should have been obvious to me right away, but we have a way of using shorthand when we describe technical issues that always makes a little back and forth useful.)

ID seems to be very reserved in SharePoint. Someone probably left some sort of back door thing in SharePoint once a long time ago, because I’ve seen using the ID parameter on the query string for anything other than the item ID cause issues way back to SharePoint 2007 at least.

By switching from ID to WorkCenter for the parameter name, all was right in the world again. For example, instead of “ID=1”, “WorkCenter=1”. Not only does this fix the issue, you end up with a query string parameter name that is more descriptive. That’s useful down the road for maintenance and will even make more sense to users. “That URL is ugly” may become “Oh, I’m selecting the WorkCenter”.

Create a Simple SharePoint 2013 Employee Directory on Office365 – Part 1 – Introduction

Employee Directories are a common feature of most Intranets. In fact, I’m working on Employee Directories for two different clients right now.

Bonzai Intranet Employee Directory Example

Bonzai Intranet Employee Directory Example

This is such a common need, that it’s firmly embedded in the fantastic work that my friends over at Dynamic Owl have built into their Bonzai Intranet product. We aren’t going to be able to do something as fancy as there is in Bonzai. But with a little work – not much coding at all – we can build a perfectly good Employee Directory for a small- to mid-sized organization.

There’s a great article by Ari Bakker (@aribakker) out there that shows how to set up a simple a Employee Directory on SharePoint 2013: How to: Create a Simple SharePoint 2013 People Directory. For this series, I owe credit to Ari for getting me started and showing me the main path. I encourage you to read Ari’s post as well.

On Office365, there are some nuances, however, plus I wanted to add some secret sauce to what I implemented. The example I’ll run through in this series is similar to the Bonzai approach, but uses mostly out of the box capabilities. The one “coding” piece is the custom Display Templates I’m using to show the alphabetic search across the top of the search results and the specific columns we want in the table listing.

Here were some of my requirements:

  • Show all current employees by default, with paging set at 50 (the maximum available with search results)
  • Display a simple to use filter based on the first letter of the last name, indicating which last name letter is currently active
  • Only “light up” letters of the alphabet when at least one person has a last name starting with that letter (no links that lead to no results)
  • Show appropriate refiners in the Refinement Panel
  • Display the search results in a more tabular way to imitate the [often Excel-based] phone listing which is common in smaller organizations
  • Offer some other sorting capabilities within the current view

My hope is that by following the steps in these posts, you’ll be able to build a simple but useful Employee Directory for your organization or clients. In the specific case I’m working on now, the organization has about 100 active employees. Based on your organization’s size and specific make up, you will probably want to tweak things along the way.

Here’s a view showing roughly where we’ll end up:

Employee Directory

If there are specific requirements you have that I don’t mention here, please add them into the comments and I’ll try to cover them.