Get SPELL Cascading Selects 1.1 from my Office 365 site

Cascading Selects EditorAfter the SPELL Tabs two weeks ago, I am now adding a Cascading Selects package to my Office 365 site.

I already mentioned the Cascading Selects back in November. It was initially created for demo purposes, to showcase the capabilities of SPELL Form, a module designed to enhance SharePoint out of the box forms.

In light of recent events (and in particular this update from the Microsoft Office team), I have repackaged it, and I am making a gratis version available to teams and small businesses. If you are interested, fill out the contact form with your company information, and you’ll receive both gratis versions – Tabs and Cascading Selects.

These packages are end user solutions, and come with an “editor view” (cf. screenshot). The full versions are more sophisticated, with tools for power users and front end developers. SPELL works in SharePoint 2007, 2010, 2013, and Office 365 (version 16).

If you are one of the 100 users who already registered their company to get the Tabs, the link to the Cascading Selects should already be in your mailbox!

Two new projects: SPrest and SPELL

I have developed a sudden interest for Codeplex, Microsoft’s open source project hosting web site.

It started last week with a post on Marc Anderson’ blog, about JSON, REST, and his infamous SPServices. In a follow up conversation, Marc pointed me to the related discussion on Codeplex. In less than 48 hours, I registered to Codeplex, posted a dozen comments, began following two existing projects, and started two projects myself.

The discussion on SPServices and JSON led me to take a closer look at the jQuery documentation, and discover several features that came with version 1.5. We’ll see how it goes, but the use of “converters” looks promising and should make Marc’s library even more powerful.

As for the two new projects, I’ll post more information as I progress, for now here is a short description.


The purpose of SPrest is to abstract the SharePoint 2010 REST services, the same way Marc abstracted Web Services. I had long been thinking about adapting Marc’s library to REST, so this Codeplex discussion was an opportunity to get started. After a long conversation with Marc, our conclusion was that including REST into the existing SPServices didn’t bring much value, so I chose to branch out and create a dedicated project called SPrest.

To be honest, it is not clear whether such a project has real value. REST is more straightforward than Web Services, as demonstrated for example in this article by Jan Tielens. Well, we’ll see…


SPELL stands for SharePoint Progressive Enhancement Lightweight Library (just keep in mind I did all of this in less than 48 hours…). Its purpose it to put together some utility functions I often reuse in my customizations, for example identifying the Web Parts present in a page. I’ll explain what I mean by “progressive enhancement” in a future article (it was the main theme of my presentation at the San Diego SharePoint User Group meeting in March).

Here is what I have so far for the SPrest library (questions and feedback welcome, as usual):

<script type="text/javascript">




var CRUDtype={"Create":"POST","Read":"GET","Update":"POST","Delete":"DELETE"};
var CRUDheader={"Create":"PUT","Update":"MERGE","Delete":"DELETE"};

// Note: Default settings can be set globally by using the $.ajaxSetup() function.
// Note: simple handling of options for this first draft

         type: CRUDtype[options.type],
         headers:(options.action=="Read")?{}:{'X-HTTP-Method-Override':CRUDheader[options.action]}, // Header for POST operations (Create, Update, Delete)
         url:"/_vti_bin/listdata.svc/"+options.listName+"?"+options.query,  // Note: escaping is currently missing in the url

}  // End ListData

}  // End SPrest

}) // End extend


An example, return the content of the Site Assets library in the Lab site:

<script type="text/javascript">
 $.SPrest.listData ({
success: function(data, textStatus, jqXHR){ alert(jqXHR.responseText);},
error: function(){ alert("error");}