InfoPath's future and what everyone's saying

dontpanic

 

Andrew Connell

  • "the future is unclear at best, realistically pessimistic and a dead-end at worst"
  • "I do not use InfoPath any more & I do not recommend people use InfoPath going forward"

http://www.andrewconnell.com/blog/now-infopath-is-dead-rip-infopath-but-now-what

http://www.andrewconnell.com/blog/my-thoughts-infopath-2013-the-future-of-infopath

 

Mark Rackley

http://forms7.codeplex.com/

 

Corey Roth

  • Lists a great list of feature sets for the future Forms solution
  • Suggest: wait and see SPC348

http://www.dotnetmafia.com/blogs/dotnettipoftheday/archive/2014/01/31/what-a-developer-wants-in-a-post-infopath-world.aspx

 

Jeremy Thakes

  • "I  found that if  you used InfoPath in your Organization to empower Information Workers to build their own forms, a lot of the times they’d hit the 80/20 rule and then hand it off to developers who would have to fix them or complete them."
  • Suggest: ISV Nintex Forms

http://www.jeremythake.com/2014/01/microsoft-confirm-infopath-2013-is-last-release-of-the-product/

 

Microsoft

  • InfoPath is dead.
  • Long live Forms:

http://www.sharepointconference.com/content/sessions/SPC348

 

Patrick Halstead

I like Patrick's coverage the best, probably because this is his bread and butter.  He has been thinking about this and planning for a while. 

His upcoming webinar series will cover the various approaches to deal with the data that's currently in the forms:

  • Status Quo: keep same format (XML): Formotus, ServBus, Qdabra eForm Viewer
  • Hybrid (SharePoint List): move the form's data into SharePoint Lists, then use SharePoint list forms
  • Convert to ISV: Nintex, K2, Adobe, Salesforce
  • Custom development (database): extract data into database, then build pages and use full set of controls

http://www.youtube.com/watch?v=Z_rhNrFx5D8 [After InfoPath: Planning your Form's Future] 

 

I say: Please Don't panic.

I'm waiting to see:

  • Qdabra eForm Viewer (cheap /  free / open source?  does the user need to do anything?)
  • Nintex Forms (roadmap, feature compatibility)
  • Microsoft's SPC348 (upgrade roadmap?  future support?  feature compatibility? could be the most expensive path)

I'm sure everyone will have a lot to say in time for the SharePoint Conference.  Stay tuned.

Building No-Code Sandbox WebParts for the past, present and the future [Proposed Session Outline]

 

[Previous Working Title: Build amazing web parts using only JavaScript and evolving your code with any version of SharePoint]

I've modified the session title based on recent events.  Namely, this big one: http://blogs.msdn.com/b/sharepointdev/archive/2014/01/14/deprecation-of-custom-code-in-sandboxed-solutions.aspx 

 

In this session I really want to talk about investing in a safe, new technology (JavaScript) that isn't going away anytime soon, and have it being useful for you, today, regardless of whether you have/are/won't migrate to SharePoint 2013 anytime soon.  I want this to be a talk about the timelessness of the technology, but also the ever-changing landscape.  I hope I can get us there.  I think it is awesome.

 

Session Description

SharePoint is an evolving platform: in 2007, we were all building farm web parts. Then in 2010, we were introduced with sandbox web parts, with the beginnings of the client side object model. In 2013, we are looking at the evolved app model, with a super-charged REST service.

As developers, while it is great to learn about what's coming down the pike, it feels extremely frustrating not knowing what to learn, or attend a session and learn a technology that you can’t put to use because you don’t use the latest and the most cutting edge in your organization.

Let’s take a step back, let’s look at how to build a web part using only JavaScript. Let’s separate the UX from the logic. Then let’s plug in different types of CRUD code to work with different versions of SharePoint, across different data sources: lists, search or user profile.

This session is about learning how to use JavaScript to build amazing web parts, regardless of what version of SharePoint you have.

 

Session Outline

 

  • What is in a little WebPart
  • Where do you run your code
    • Running the code on the Server (.NET)
    • Running the code on the browser (JavaScript)
  • Choices:
    • SPServices
    • CSOM
    • REST (listdata.svc)
    • REST (_app)
  • Platforms
    • SP2007
    • SP2010
    • SP2013
    • Office 365
  • Framework Considerations:
    • Plain JQuery
    • KnockoutJS
    • AngularJS
  • Adding Value:
    • TypeScript (Syntax, Intelli-Sense)
    • Jasmine (Unit Testing)
  • Where are we, where are we going
    • Where should we be?
  • Demo
    • Can't possibly cover everything and still have a working demo, can I?  Though I do love having demos to show people at the end of a session.

 

This is a session in ongoing development.  But I wanted to throw out the outlines and get some feedback on what do you want to see?  And what do you NOT want to see.

Let me know below!

Using spservices to create discussion and reply in a Discussion List

This updated blog post describes how I go about building a threaded, inline comments system for any page, using a SharePoint Discussion List as the backend storage for threaded data.

I choose to use SPServices because originally, the webpart is built for a SharePoint 2007 environment.  

I've rebuilt the webpart using the JavaScript code and confirm it runs happily in SharePoint 2013, and this time, with much better screenshots!
In SharePoint 2010 and 2013, you should be able to talk directly to the REST endpoint to perform read and updates.

Enter the Discussion List

 

Many users have a love-hate relationship with SharePoint's Discussion list.  Perhaps more hate.  The main culprit is the inflexible UI.  Lack of many modern forum needs:

  • Can't show all discussions and show threaded replies together
  • Can't do inline new discussion
  • Can't do inline replies
  • Poor support cross browsers
  • Can't easily filter for a subset

But still, the list itself is very functional.

  • Does support threaded discussions
  • Calculates total replies and last discussion updated
  • Has email notification through SharePoint alerts
  • Has tweaked permission model where users can create but not modify their own posts, or can edit.

 

Image888

Figure: A basic SharePoint Discussion List

 

Let's ignore the problems with the native Discussion List UI, and build our own with JavaScript

Read from the Discussion List

 

/*
This code queries using SPServices' GetListItems on list and populates a UL.discussions dom element on the page
*/
var $ul = $("ul.discussions");
var list = "My Discussions";

function getDiscussionList(list, $ul) {
var promise = $().SPServices({
  operation: "GetListItems",
  listName: list,
  CAMLViewFields: "<ViewFields><FieldRef Name='Title' /><FieldRef Name='Body' /><FieldRef Name='Author' /><FieldRef Name='Modified' /><FieldRef Name='DiscussionLastUpdated' /><FieldRef Name='ItemChildCount' /></ViewFields>",
  CAMLQuery: "<Query><OrderBy><FieldRef  Name='DiscussionLastUpdated' Ascending='FALSE' /></OrderBy></Query>"
});

promise.done(function(){
  var items = $(promise.responseXML).SPFilterNode("z:row").SPXmlToJson({
    mapping: {},
    includeAllAttrs: true,
    removeOws: true
  });
  $ul.empty(); // clear old list

  $.each(items, function(index, item) {
    // render each discussion
    var $li = $("<li class=discussion' />");
    $li.append(item.Title);
    $li.append(item.Body);
    $li.append(item.Author);
    $li.append(item.Modified);
    $li.append(item.DiscussionLastUpdated);
    $li.append(item.ItemChildCount);
    $li.append(item.FileRef);
    $li.append("<div class='replies'>replies</div>");
    $ul.append($li);

  });  // end items.each
}); // end promise done
promise.fail(function(xhr, status, error) {
  alert(xhr.responseText);
}); // end promise fail

} // end getDiscussionList


Key points:

  • List.asmx - GetListItems
  • This returns the top level items in the list, which are Discussions

 

Figure out the threaded discussions


In SharePoint discussion lists, the top level "Discussion" items are folders.  The subsequent "Message" reply items are list items within that folder.
So to query for the replies to a discussion, we query the list with the filepath of the top level Discussion item as the query filter.

/*
This second function figure out the threaded replies when you expand one discussion
*/

Note: The FileRef usually has a value that looks like this:
// 15;#Company/Site1/Web1/Lists/My Discussions/15_.000
You need to clean the URL and use only the file path:

function getFilePath(fileRef) {
  if (!fileRef) return;
  var m = /;#(.*)$/.exec(fileRef);
  if (m) {
    return m[1];
  }
}

This will give you:
Company/Site1/Web1/Lists/My Discussions/15_.000

function getDiscussionReplies(list, filepath) {
var options = {
  operation: "GetListItems",
  listName: list,
  CAMLViewFields: "<ViewFields><FieldRef Name='Title' /><FieldRef Name='Body' /><FieldRef Name='Author' /><FieldRef Name='Modified' /><FieldRef Name='DiscussionLastUpdated' /><FieldRef Name='ItemChildCount' /></ViewFields>",
  CAMLQueryOptions: "<QueryOptions><ViewAttributes Scope='RecursiveAll' IncludeRootFolder='True' /></QueryOptions>",
  CAMLQuery: "<Query><Where><Contains><FieldRef Name='FileRef' /><Value Type='Text'>" + filepath + "</Value></Contains></Where><OrderBy><FieldRef  Name='FileRef' Ascending='TRUE' /></OrderBy></Query>"
};
var promise = $().SPServices(options);

promise.done(function(){
  var items = $(promise.responseXML).SPFilterNode("z:row").SPXmlToJson({
    mapping: {},
    includeAllAttrs: true,
    removeOws: true
  });

  $.each(items, function(index, item) {
    // render each reply
    // snipped

  });  // end items.each
}); // end promise done

} // end getDiscussionReplies

 

Key points:

  • Use CAMLQueryOptions for RecursiveAll
  • Use FileRef contains FilePath to find all threaded (Message) replies

Create a Discussion in the Discussion List

To create a new discussion, you just need to create a new item in the Discussion List

var list = "My Discussions";
var title = $("input.title").text();
var body = $("textarea.body").text();

function newDiscussion(list, title, body) {

var promise = $().SPServices({
  operation: "UpdateListItems",
  batchCmd: "New",
  listName: "Team Discussion",
  updates: "<Batch OnError='Continue' >" +
       "<Method ID='1' Cmd='New'>" +
        "<Field Name='ContentType'>Discussion</Field>" +
       "<Field Name='FSObjType'>1</Field>" +   // Important: FSObjType = 1 means that this is a folder.  If this isn't specified SharePoint sometimes create the wrong root level item.
        "<Field Name='Title'>" + escapeColumnValue(title) + "</Field>" +
        "<Field Name='Body'>" + escapeColumnValue(body) + "</Field>" +
       "</Method>" +
      "</Batch>"
});
   
promise.done(function(){
  var $ul = $("ul.discussions");
  getDiscussionList(list, $ul);

}); // end promise done

}

 

Image893

Figure: Start a new discussion inline

Key points:

  • List.asmx - UpdateListItems
  • Set FSObjType = 1, this is necessary or there were head-scratching bugs

 

(Optional) Filter a Discussion List to only related item

 

In the Discussion List settings, you can add a lookup column RelatedItem to an external List (or Document Library).
Then when you use the JavaScript above, you can filter your CAML Queries so that they only return elements that are related to the current page.

For getDiscussionList:

CAMLQuery: "<Query><Where><Eq><FieldRef Name='RelatedItem' /><Value Type='Number'>" + related + "</Value></Eq></Where><OrderBy><FieldRef  Name='DiscussionLastUpdated' Ascending='FALSE' /></OrderBy></Query>"

And for creating discussion threads:

updates: "<Batch OnError='Continue' >" +
     "<Method ID='1' Cmd='New'>" +
      "<Field Name='ContentType'>Discussion</Field>" +
      "<Field Name='FSObjType'>1</Field>" +
      "<Field Name='Title'>" + escapeColumnValue(title) + "</Field>" +
      "<Field Name='Body'>" + escapeColumnValue(body) + "</Field>" +
      "<Field Name='RelatedItem'>" + related + "</Field>" +
     "</Method>" +
    "</Batch>"


In my project, I linked my discussion list to a Video Library, and each Video has an area for creating comments and reply to threaded discussions.  All the conversation are saved in one single Discussions List, but filtered on each page as required.

Understand the nested format for Discussion List items

In a SharePoint Discussion List:

  • Discussion (content type) is a Folder.  FSObjType = 1
  • Message (content type) is a List Item.  FSObjType = 0

 

Reply in a Discussion List.


var list = "My Discussions";
var filepath = "Company/Site1/Web1/Lists/My Discussions/15_.000";
var body = $("textarea.body").text();

function replyDiscussion(list, filepath, body) {

// RootFolder needs to start with /

var promise = $().SPServices({
  operation: "UpdateListItems",
  batchCmd: "New",
  listName: list,
  updates: "<Batch OnError='Continue' RootFolder='" + "/" + filepath + "'>" +  // RootFolder needs to start with /
     "<Method ID='1' Cmd='New'>" +
      "<Field Name='ContentType'>Message</Field>" +
      "<Field Name='FSObjType'>0</Field>" +
      "<Field Name='Body'>" + escapeColumnValue(body) + "</Field>" +
     "</Method>" +
    "</Batch>"
});
promise.fail(function(xhr, status, error) {
  alert(xhr.responseText);
});
promise.done(function(){
  getDiscussionReplies(list, filepath);
});

} // end replyDiscussion

 

Image882

Figure: Threaded Discussions, with inline reply.


Key points:

  • List.asmx - UpdateListItems
  • Set FSObjType = 0 (for List Item), this is necessary or there were head-scratching bugs
  • Set RootFolder to the Filepath of the parent Discussion (folder) item.  This way, UpdateListItems creates a new list item within that folder.

 

 

Conclusion: here we are.  Threaded, inline, replies.


Combine everything together, the javascript lets me now do:

  • Tie a Discussion List to a Picture Library
  • Start one or more discussion threads on any Picture
  • See replies inline in one single UI.
  • Inline comment-creation
  • Inline comment-reply

 

  • Inline Edit and Inline Delete is possible, but the end-user will need to follow SharePoint permission settings on the Discussion List.  I have not written code to do those operations. 

2014 begins with a SharePoint Server MVP Award

Sometime in the early hours of the 2nd of January (I live in Australia time), I received a confirmation email from Microsoft that I've been awarded MVP for 2014. The award is for contribution in SharePoint Server technical communities.

I am extremely honoured to be counted with many long time MVP that are the faces in the community.

Thank You

There is a long list of people I need to thank:

Ivan Wilson - boss and long time SharePoint veteran in Sydney. Runs the Sydney SharePoint user group. Ex-5yr-MVP but just got too busy after our company started growing (a certain trouble-maker, me, joined the company). Dear leader, I'm glad to finally return an MVP Award to the shelf!

Jonathan - boss, appearing briefly in the user groups, but understood and supported Ivan and my adventures in the community. Lets me fly or travel to all the events. May be its because he likes flying as well.

My colleagues Justin, Jumpei and Bart for being my test audience for some really rough presentations. On the positive side, they have seen presentations that has never made it out of the office door - too geeky or just too crazy.

My lovely wife Lina who has to deal with my flying everywhere and now also handle two kids like a PRO. She knows this award made me really happy, but let me tell you: Behind every great man, is a wife who isn't impressed (and no, I'm not great - though she definitely remains not impressed).

Brian - from our first meeting in a Canberra pub where I try to sell an MVP the virtues of running reporting services integrated with SharePoint - not knowing who he was. It has been great to go to the numerous SharePoint Saturday events around Australia. There are too many shenanigans to list, and plenty of fun memories.

Elaine - the MCM that I know the most, and the MVP that I tried to follow. Friendly, relaxed knows everything. Seems to be everywhere, all the time. You realise as you attend the sessions that Elaine and other MVPs hold - there's so much experience and knowledge and they make it into a session that people can consume and learn from.

Adam Cogan - MS Regional Director and running the oldest user group in Sydney. Adam's SSW was the first user-group company that I worked in, and showed me the value of the communities that I've come to love. Even as I focus only on SharePoint and away from general .NET, I still get to see Adam in the communities rallying the crowd. I've always held Adam as a master magician. But I've realised that a magician is also a teacher, and Adam may be the best that I know.

Debbie Ireland - for running the SharePoint Conference in Australia and NZ. The premier event for SharePoint in the Oceanic Region and letting me present for the last few years!

So Young Lee - our MVP Lead, I missed a good opportunity to catch her in TechEd last year. So have only talked via email. Thank you for granting me the Award!

Mark Rhodes, Daniel Brown, Daniel McPherson, James Milne, Ishai, Sezai, so many other MVPs for being an inspiration to me, both with what you knew, and the efforts you put into the community. Thank you for being great examples, made it fun to be in the community and I look forward to more MVP in the future!

The Process

I don't believe there's a Rule about not talking about the MVP Award process. So here is how it works, as I understand it:

  • The MVP Award is given by Microsoft for contributions to the community in the previous year.
  • You need to be nominated - anyone could nominate, including self nomination, I personally think there's probably a filtering that happens. It may help if the MVP lead in your region knows at least your name, or if the nomination came from someone well known.
  • Then you fill out a really complicated score card of all the events and activities that you have participated in the last year. There seems to be a few different versions, Excel or web application. The end result is to quantify your community reach.
  • Finally, you are told which round your application is being considered, and you hold your breath on that day. Mine happens to be 1st of Jan.

I've been holding my breath the entire week.

Get Involved:

  • Go to your user group. Present. Lots of users groups around Australia also accepts remote presentations.
  • Present at the SharePoint Saturday events when they roll around your city. Or volunteer to visit another city!
  • SharePoint Conference in Australia and NZ
  • TechEd AU
  • Write a blog. Keep it fresh. My blog documents a number of interesting techniques with InfoPath and has been referenced continuously from the Microsoft forums - even long since I lessened my involvement in that community. Engage with people commenting on your blog.
  • Create a CodePlex or github project relating to SharePoint
  • Participate in SharePoint on StackOverflow
  • I'm told if you write a book or runs web series on SharePoint that would help.

Remember you'll need statistics from all these activities for the score cards.

Getting nominated:

  • Get to know the people in the SharePoint community around you.

This helps for your nomination. I personally don't know who nominated me. I wasn't sure whether to ask anyone or just wait. I decided to wait and someone did nominate. I have a few guesses but honestly I have no idea.

Keep a positive, can-do attitude with SharePoint

Finally, we work with SharePoint day in and out. We know it's got lots of quirks. I personally believe it's not good to dwell on the bad but focus on what you can do about it. It's all too easy to jump on the wagon complaining about what SharePoint does. It is far better value and more useful to the community when we explain why SharePoint does what it does, and what we can do to tell it to do something else that we wanted.

Happy New Year!  It's been awesome so far.

SPSSYD 2013 and special thanks to Brian Farnhill

I wanted to thank Brian Farnhill for organizing SharePoint Saturday (SPS) events in Australia faithfully for the last few years.  SharePoint Saturday Sydney 2013 was the last one where he is the official organizer, chief, keynoter, label-printer, sponsor-chaser, etc. etc.

The event had a lot of highlights for me:

  • A lot of people showed up early and was ready at the keynote. 
  • Coffee Cart showed up on time in the morning
  • The Clifton venue (they moved since last year) was amazing - I really liked the layout of the sofa and the meal table-benches were great for conversation
  • Lunch was hopefully just enough - I think right at the end we might have just ran out of sandwiches
  • Adam got rick rolled'
  • Ross' session had a memory moment (I heard second hand)
  • My session had a major projector fail (more on this later)

 

Presentation - Typescript PowerPoint and demo project

 

Explanation - What happened to the projector / your laptop?!

 

I was using a USB-3 display link adapter for the last month.  But I didn't realize it would behave very badly with the HDMI-VGA dongle for the projector at the event.  A quick fumbling got the display to work.  But it was black and white but I was going to run out of time so I just ran with it.

I'm glad you guys had laughs at my expense.  It made me feel a little bit less miserable.

Love you guys.