SharePoint 2016 Features & Enhancements

What is in the pipeline for On-Premise SharePoint 2016?

Earlier this month Microsoft announced new SharePoint 2016 features and enhancements to a packed house of several thousand attendees at the Ignite conference. With the 2016 on premises version scheduled to be released Q2 2016, some distinct outlines of the finished product are starting to take form.

SharePoint 2016 for IT Professionals Ignite Presentation Cover

Microsoft is Cloud First

As previously declared, Microsoft is pursuing a “Cloud first” strategy, in which Office 365 is regularly updated with new releases, and with on premise deployments catching up every two or three years. Many of the updates to 2016 were already expected, having already been released to cloud customers. On the other hand, on premises version of SharePoint continues to be a distinct product, with unique conditions and challenges, and as such there are some new features to the 2016 release that are uniquely on prem-only features. And there are no actual changes to the Service Application architecture.

Installation Requirements:

* Must use Windows Server 2012R2 or Windows Server 10

* .Net 4.5 (or 4.52 for Windows Server 10) features

* Upgrades only supported from SharePoint 2013 versions

The bulk of the announced updates for 2016 are centered on back-end enhancements. Here’s the rundown…

Authentication is moving away from domain based authentication and towards cloud based identification models. Identity management will be handled over SAML claims by default, normalizing over OAUTH. As this is the standard for O365, this makes transitions to the cloud easier. Former authentication will be supported on a legacy basis.

SMTP encryption would be supported with STARTTLS, and no fallback for non-encrypted SMTP will be officially supported. Although, this could potentially be achieved by using non-default ports.

Boundaries and Limits

* Content DBs can scale into TBs

* 10,000 site collections per content DB

* MaxFile increases to 10GB and removed character restrictions

* Increased List View Threshold beyond 5000

* 2x increase in search scale to 500 million indexed items

Performance Upgrades

Distributed Cache handling has been upgraded, and previous “authentication overload” issues have been resolved. This will result in more scalable and available WFE performance.

Serving of end user files will also be made more efficient by leveraging BITS (Background Intelligent Transfer Service).

The site and site collection creation process has been greatly sped up by changing the underlying provisioning process. Whereas before this was a lengthy process with complicated provisioning logic and feature activations, the new process essentially performs a SPSite-Copy operation to clone a site from a “master copy”. The bulk of the operation is now only at the database level and is much more efficient.

Traffic management promises to perform with more resiliency. New endpoints have been built on Web Front Ends to establish affinity with load balancers, resulting in more intelligent routing scenarios based on web front end health conditions.

User Profile Service changes

Improvements have been made to reliability and ease of setup of the User Profile Service. FIM will no longer be baked into SharePoint installations, and external FIM service will be offered as an alternative.

Durable Links

Durable Links will be featured so that if an end user renames or changes the location of a document, previous URLs will redirect to the new file location. Built using Cobalt endpoints, a Redirect Manager will track documents based on a docID.

SharePoint Server Roles for the Upcoming SharePoint Online 2016 Release

Microsoft Ignite 2015 Highlight

bill-baer-sharepoint-2016

Bill Baer, Microsoft Technical Product Manager and Certified Master presents “What’s New for IT Professionals in SharePoint Server 2016” at Microsoft Ignite 2015.


In typical SharePoint deployments, SharePoint servers typically serve a dedicated server “role”, depending on which features have been enabled.  For example, Web Front End and App servers are common dedicated roles.  But without much guidance from Microsoft, customers have implemented various implementations of such roles, with some mixed results.  As an effort to control the chaos, Microsoft developed “Specialized Server Roles”, which are defined via the SharePoint Configuration Wizard.  SharePoint server roles for 2016 include:

Server Roles

  • Specialized – provides an agnostic role a la 2010 – recommended for 3rd party service in order to accommodate that need
  • Web Front End
  • Search
  • Application
  • Distributed Cache
  • OR Single Server Farm – requires to install SQL server on the same machine.  SQL Express is no longer supported.

SharePoint Server Roles, dubbed “MinRole” as an internal name, will be monitored by Health Analyzer to detect and report any deviation from the role standards.  For example, this could happen if an admin extends SharePoint search onto a Web Front End server.  In the Central Admin Servers in Farm page, an admin can click a “Fix” link to bring the server back into the expected alignment of the server role.

New Developer Tools for Office 365

Lessons learned from Ignite 2015: Microsoft is trying to enable cloud development

Office 365 Developer Tools

Microsoft has recently released new developer tools for Office 365. These advancements make development of an Office 365 customization faster, easier, and cheaper to implement. For customizations that span multiple Office 365 applications, a unified endpoint makes the authentication process much easier while connecting to the Office 365 API. Additionally, a new OAUTH sandbox interface and API Explorer makes query building a breeze.

Currently there are many disparate APIs serving individual Office 365 applications, such as OneDrive, Exchange, and User Profile Service. As a developer creates an Office 365 customizations, often several endpoints are required. For example, one such customization could automatically export email attachments to a user’s OneDrive. In this case, the developer would need to interface with three or four separate endpoints. By unifying endpoints, efficiencies are gained for the developer by needing to write less code since only one endpoint connection would need to be made.

When connecting to each endpoint, OAUTH operations are performed for handling authentication to Office 365 servers. This process follows a pattern of four essential steps: app issues authorization request for a given client ID, the user consents to the permissions request, app issues client secret to get a session access token, then finally the app passes the token and client ID when requesting a resource. Additionally session refresh requests need to be made periodically so that the session does not expire. This workflow could involve hundreds of lines of code, and is no easy undertaking for novice developers.

But now, thanks to the new ADAL libraries released by Microsoft, these operations can be performed much more efficiently. This implies considerable time savings to the developer and cost savings to the business.

SharePoint Consulting: Solutions to Common BCS Errors

Solving BCS Errors with SharePoint Consulting

My recent SharePoint consulting work has involved working through a few BCS errors. Programmatically accessing BCS External Lists in SharePoint is a bit like working in a parallel universe.  Most list access rules will continue to apply, however there are some very special caveats that one must remember.

For the reader’s findability convenience, I am organizing this guide in terms of the errors that the user will most likely encounter.

Reading and querying an External List

“The given key was not present in the dictionary”

This error may appear if any one of the CAML query conditions have not been met:

  • Viewfields were not specified
  • Viewfields and Query were specified via the ViewFields property (as opposed to using the ViewXML and Query properties)
  • The Method name was not included.  In most cases this should be either ‘Read List’ or ‘ReadList’.

Here is an example of a correctly laid out CAML query for BCS.

SPQuery query = new SPQuery();

query.ViewXml = @”

<View>

<Method Name=’Read List’/>

<Query>

<Where>

<Eq>

<FieldRef Name=’SUBMISSION_ID’/>

<Value Type=’Text’>FilterValHere</Value>

</Eq>

</Where>

</Query>

<ViewFields>

<FieldRef Name=’SUBMISSION_ID’/>

<FieldRef Name=’PACKAGE_ID’/>

</ViewFields></View>”;

“The Finder ‘ReadList’ cannot be found in ViewGroup associated with SpecificFinder (Read Item) operation ‘ReadItem’ in EntityNamespace”

This sort of error can appear if an incorrect Method name was supplied above.  Pay attention to caps and spaces.  In my own case, I had to pull open SharePoint Designer and check the exact name of the Read List operation, and I found that there was a space in the method name.

The shim execution failed unexpectedly – Proxy creation failed. Default context not found..

This error will appear if you did not declare the SPServiceContextScope.  You can perform this operation as shown below.  Note that the scope must be declared BEFORE the SPWeb is instantiated.

using (SPSite site = new SPSite(“http://mysite”))

{

var context = SPServiceContext.GetContext(site);

using (var scope = new SPServiceContextScope(context))

{

using (SPWeb web = site.RootWeb)

{

SPList myList = _web.Lists[“myList”];

SPQuery query = new SPQuery();

….

}

}

}

Writing to External Data columns / External Content Types

Setting values to External Data type columns require additional operations in order for the item to correctly linked to External Data source.  This is evident as one tries an operation like:

SPList submissionList = _web.Lists[_submissionListTitle];

SubmissionList.Items[0][ExternalDataCol] = “New value”

This operation will not change the “additional fields” columns.  This problem can be resolved by using the following commands and methods…

private static IEntityInstance GetEntityInstance<T>(SPSite site, string nameSpace, string entityName, T entityId)

{

var svcContext = SPServiceContext.GetContext(site);

using (var scope = new SPServiceContextScope(svcContext)) {

BdcService service = SPFarm.Local.Services.GetValue<BdcService>();

IMetadataCatalog catalog = service.GetDatabaseBackedMetadataCatalog(svcContext);

IEntity entity = catalog.GetEntity(nameSpace, entityName);

ILobSystemInstance LobSysteminstance = entity.GetLobSystem().GetLobSystemInstances()[0].Value;

IEntityInstance entInstance = null;

// Get methods collection

foreach (KeyValuePair<string, IMethod> method in entity.GetMethods())

{

// Get current method’s instance

IMethodInstance methodInstance = method.Value.GetMethodInstances()[method.Key];

// Execute specific finder method.

if (methodInstance.MethodInstanceType == MethodInstanceType.SpecificFinder)

{

// Create new identity

Identity id = new Identity(entityId);

// Execute specific finder method and get the entity instance

entInstance = entity.FindSpecific(id, entity.GetLobSystem().GetLobSystemInstances()[0].Value);

}

}

return entInstance;

}

}

private static void SetSecondaryFields(SPListItem listItem, SPBusinessDataField dataField, IEntityInstance entityInstance)

{

// Convert the entity to a formatted datatable

DataTable dtBDCData = entityInstance.EntityAsFormattedDataTable;

// Set the BCS field itself (Display Value)

listItem[dataField.Id] = dtBDCData.Rows[0][dataField.BdcFieldName].ToString();

// Get the specific finder method to get the columns that returns

IMethodInstance method = entityInstance.Entity.GetMethodInstances(MethodInstanceType.SpecificFinder)[0].Value;

ITypeDescriptorCollection oDescriptors = method.GetReturnTypeDescriptor().GetChildTypeDescriptors()[0].GetChildTypeDescriptors();

// Set the column names to the correct values

foreach (ITypeDescriptor oType in oDescriptors)

{

if (oType.ContainsLocalizedDisplayName())

{

if (dtBDCData.Columns.Contains(oType.Name))

{

dtBDCData.Columns[oType.Name].ColumnName = oType.GetLocalizedDisplayName();

}

}

}

// get the secondary field display names; these should be set

string[] sSecondaryFieldsDisplayNames = dataField.GetSecondaryFieldsNames();

// loop through the fields and set each column to its value

foreach (string columnNameint in sSecondaryFieldsDisplayNames)

{

Guid gFieldID = listItem.Fields[String.Format(“{0}: {1}”, dataField.Title, columnNameint)].Id;

listItem[gFieldID] = dtBDCData.Rows[0][columnNameint].ToString();

}

}

public SPListItem SetExternalDataCol<T>(SPListItem item, SPSite site, string ExternalDataColName, string ExternalContentTypeName, T fieldId)

{

SPBusinessDataField dataField = item.Fields[ExternalDataColName] as SPBusinessDataField;

item[dataField.RelatedField] = fieldId;

SetSecondaryFields(item, dataField, GetEntityInstance(site, site.Url, ExternalContentTypeName, fieldId));

return item;

}

The methods can be executed using this example code:

using (SPSite site = new SPSite(“http://mysite”))

{

using (SPWeb web = site.RootWeb)

{

SPList list = web.Lists[“My List”];

SPListItem newItem = list.AddItem();

newItem[_properties.Column_TemplateID_List_SubmissionTasks] = templateCollection[i][“ID”];

newItem = SetExternalDataCol(newItem, site,  “External Data Column Name”, “My External Content Type”, “External Column ID”);

newItem.Update();

}

}

 For more, check out what our SharePoint consulting team is up to in our Knowledge Base.

SharePoint Consulting: Workflow Not Found

Managing New Workflow Manager Installation with SharePoint Consulting

I needed to remove a Web Front End (WFE) from a SharePoint farm for development reasons, but afterwards we noticed that workflows stopped working.  To remedy this, I decided to just re-install Workflow Manager on the main WFE.  Though this is not normally a recommended practice, we had few concerns since we are only working off a development environment.

I installed Workflow Manager on the WFE, then registered Workflow Manager using the –Force parameter to write over the previously registered Workflow Manager.

Register-SPWorkflowService –SPSite “http://mysite” -WorkflowHostUri “http://mysite:12291″ –SharePoint Consulting: Workflow ManagerAllowOAuthHttp -Force

However after installing Workflow Manager on the WFE I got the following error when starting a workflow:  “Something went wrong.  To try again, reload the page and then start the workflow.”

Workflow exception: “Something went wrong. To try again, reload the page and then start the workflow.”

This error wasn’t terribly descriptive, so I then checked the ULS logs and found these two errors:

“Microsoft.Workflow.Client.WorkflowNotFoundException: Workflow ‘e0a7dd54-cdb2-430f-bd98-16f6f9c1132c’, for scope ‘/SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541′, was not found. HTTP headers received from the server – ActivityId: 34956577-bdab-4a56-a2bf-25b2f33dc0af. NodeId: BOGBOWSDEV01. Scope: /SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541. Client ActivityId : a7c4369c-e8b8-f00e-7f24-c293dc32ac42. —> System.Net.WebException: The remote server returned an error: (404) Not Found.     at Microsoft.Workflow.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)     at Microsoft.Workflow.Client.HttpGetResponseAsyncResult`1.End(IAsyncResult result)     at Microsoft.Workflow.Client.ClientHelpers.Se…     a7c4369c-e8b8-f00e-7f24-c293dc32ac42”

“Exception occured in scope Microsoft.SharePoint.WorkflowServices.WorkflowInstanceService.StartWorkflowOnListItem. Exception=Microsoft.Workflow.Client.WorkflowNotFoundException: Workflow ‘e0a7dd54-cdb2-430f-bd98-16f6f9c1132c’, for scope ‘/SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541′, was not found. HTTP headers received from the server – ActivityId: 34956577-bdab-4a56-a2bf-25b2f33dc0af. NodeId: BOGBOWSDEV01. Scope: /SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541. Client ActivityId : a7c4369c-e8b8-f00e-7f24-c293dc32ac42. —> System.Net.WebException: The remote server returned an error: (404) Not Found.     at Microsoft.Workflow.Common.AsyncResult.End[TAsyncResult](IAsyncResult result)     at Micro…                a7c4369c-e8b8-f00e-7f24-c293dc32ac42”

Again, these errors weren’t very descriptive.  Through a bit of trial, error, and luck, I finally realized that the previously existing workflows were only deployed to the old Workflow Manager, which was no longer in use.  Obviously the workflows would need to be redeployed for the new Workflow Manager.  I then tried redeploying the workflows, and success!  The workflows worked as expected.

SharePoint 2013: Three Ways to Improve Efficiency

SharePoint 2013 and Your Workflow

We’ve already discussed some of the benefits of using SharePoint 2013 in previous blog posts. Oil and gas businesses can drastically increase production and profits by using SharePoint to organize and disseminate information.

Consultants presenting on SharePoint 2013Once you have your information loaded into SharePoint, it won’t do you any good if you can’t find what you need when you need it. At SharePoint Saturday in Dallas this year, I presented with SharePoint Consultant Theresa on some of the ways that businesses can accomplish this.

SharePoint 2013 has added some features and upgrades to help you sort and find the information you need quickly. You can also share information with your employees, vendors and other parties with a simple click of a button. Here are three new additions that you can start using today:

Office Web Apps

SharePoint 2013 has upgraded Web Apps that can be used within and outside of SharePoint. These apps allow you to track changes and leave comments on documents and sites. You can also allow co-authoring of sites and files, as well as embed links and other features.

You can also share information from SharePoint to other users outside of SharePoint, making information easily accessible to all users, regardless of whether they work within your company or are a third-party user.

Sharing

SharePoint 2013 makes it easy to share information with employees and other users outside of your company. SharePoint 2013 gives users the ability to add permissions for other users to share and use information.

You can share a site, a library or lists with other users of your choosing. Users can also request permissions to access information that you own; you have the choice of approving or declining the request.

Newsfeeds & Other Networking

SharePoint 2013 has several new features that allow you to do more in less time and quickly connect with other users. You can easily create news-feeds that allow you to see updates and stay up on the latest changes to.

SharePoint now has a micro-blogging feature that allows you to share information informally and keep everyone updated. There is also a feature similar to Twitter that allows you to post status updates and use hash tags to organize information.

You can follow other users and follow documents so you can keep up with the latest changes. SharePoint 2013 also has a new feature that allows users to set up a Team Inbox.

Want to share something with everyone on your team? Drag files and documents to the inbox to share with all members. This allows you to keep pertinent information together where everyone can find what they need and make decisions quickly.

SharePoint 2013 is constantly releasing upgrades and new features that make it increasingly less complicated to use. Everyone can access information and use files in SharePoint, whether they are a computer expert or brand new to computer use. S

harePoint 2013 will allow you to increase employee productivity and in turn increase the productivity of your business. If you haven’t started using SharePoint, get in touch with your SharePoint consulting expert today to get yourself and your employees on board.

For more new features, check out this post, Who Moved My SharePoint (to 2013)?

SharePoint Consultant Troubleshoot: Fixing Workflow Not Found Exception

SharePoint Consultant & New Workflow Manager Installations

The SharePoint consultant team needed to remove a Web Front End (WFE) from a SharePoint  farm for development reasons, but afterwards we noticed that workflows stopped working.  To remedy this, I decided to just re-install Workflow Manager on the main WFE.  Though this is not normally a recommended practice, we had few concerns since we are only working off a development environment. I installed Workflow Manager on the WFE, then registered Workflow Manager using the –Force parameter to write over the previously registered Workflow Manager. Register-SPWorkflowService –SPSite “http://mysite” -WorkflowHostUri “http://mysite:12291” -AllowOAuthHttp -Force

Troubleshooting SharePoint Workflow Errors

SharePoint consultant trouble shooting: error message However after installing Workflow Manager on the WFE I got the following error when starting a workflow:  “Something went wrong.  To try again, reload the page and then start the workflow.” This error wasn’t terribly descriptive, so I then checked the ULS logs and found these two errors:

“Microsoft.Workflow.Client.WorkflowNotFoundException: Workflow ‘e0a7dd54-cdb2-430f-bd98-16f6f9c1132c’, for scope ‘/SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541’, was not found. HTTP headers received from the server – ActivityId: 34956577-bdab-4a56-a2bf-25b2f33dc0af. NodeId: BOGBOWSDEV01. Scope: /SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541. Client ActivityId : a7c4369c-e8b8-f00e-7f24-c293dc32ac42. —> System.Net.WebException: The remote server returned an error: (404) Not Found. at Microsoft.Workflow.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) at Microsoft.Workflow.Client.HttpGetResponseAsyncResult`1.End(IAsyncResult result) at Microsoft.Workflow.Client.ClientHelpers.Se… a7c4369c-e8b8-f00e-7f24-c293dc32ac42”

“Exception occured in scope Microsoft.SharePoint.WorkflowServices.WorkflowInstanceService.StartWorkflowOnListItem. Exception=Microsoft.Workflow.Client.WorkflowNotFoundException: Workflow ‘e0a7dd54-cdb2-430f-bd98-16f6f9c1132c’, for scope ‘/SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541’, was not found. HTTP headers received from the server – ActivityId: 34956577-bdab-4a56-a2bf-25b2f33dc0af. NodeId: BOGBOWSDEV01. Scope: /SharePoint/default/8586cf62-a76c-464b-8ad0-2609f5c6cc01/b2301f34-5ce3-4237-b818-0942146a7541. Client ActivityId : a7c4369c-e8b8-f00e-7f24-c293dc32ac42. —> System.Net.WebException: The remote server returned an error: (404) Not Found. at Microsoft.Workflow.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) at Micro… a7c4369c-e8b8-f00e-7f24-c293dc32ac42”

Again, these errors weren’t very descriptive.  Through a bit of trial, error, and luck, I finally realized that the previously existing workflows were only deployed to the old Workflow Manager, which was no longer in use.  Obviously the workflows would need to be redeployed for the new Workflow Manager.  I then tried redeploying the workflows, and success!  The workflows worked as expected. For more SharePoint troubleshooting tips, visit our best practices blog!

SharePoint 2010 and AutoSPInstaller

During a recent SharePoint migration, Entrance software consultants decided to try out a new tool that might help speed up the process of installation, called AutoSPInstaller. The description on the tool’s website is, “automated SharePoint 2010/2013 PowerShell-based installation script.”

We are always trying out new technology and tools that can make our process more efficient and save our clients time, but in this case, the lesson learned from the Installer is to vet tools before you commit to them. As we began to install SharePoint, we ran into many bugs with this tool, and in each case the bug had to be fixed. By the time we finished de-bugging, most of the time savings  from using a more stream-lined tool were lost.

While we might be able to use our de-bugged version of AutoSPInstaller for future SharePoint projects, but every install is different, and many of the bugs that we fixed might not apply in another situation.

The best advice that we can share for avoiding a gotcha like this one is to properly vet any tool before committing to it full-scale for a project. For more on SharePoint installs, check out our case study on one we did after a merger for an E&P company…

SharePoint Consulting Tips: Solutions to Common BCS External List Errors

As a SharePoint consultant, I get the chance to work through a lot of interesting problems. In this case, programmatically accessing BCS External Lists in SharePoint is a bit like working in a parallel universe.  Most list access rules will continue to apply, however there are some very special caveats that one must remember.

For the reader’s findability convenience, I am organizing this guide in terms of the errors that the user will most likely encounter.

SharePoint limitationsReading and querying an External List

“The given key was not present in the dictionary”

This error may appear if any one of the CAML query conditions have not been met:

–    Viewfields were not specified

–     Viewfields and Query were specified via the ViewFields property (as opposed to using the ViewXML and Query properties)

–          The Method name was not included.  In most cases this should be either ‘Read List’ or ‘ReadList’.

Here is an example of a correctly laid out CAML query for BCS:

SPQuery query = new SPQuery();
query.ViewXml = @”
<View>
<Method Name=’Read List’/>
<Query>
<Where>
<Eq>
<FieldRef Name=’SUBMISSION_ID’/>
<Value Type=’Text’>FilterValHere</Value>
</Eq>
</Where>
</Query>
<ViewFields>
<FieldRef Name=’SUBMISSION_ID’/>
<FieldRef Name=’PACKAGE_ID’/>
   </ViewFields></View>”;

“The Finder ‘ReadList’ cannot be found in ViewGroup associated with SpecificFinder (Read Item) operation ‘ReadItem’ in EntityNamespace”

This sort of error can appear if an incorrect Method name was supplied above.  Pay attention to caps and spaces.  In my own case, I had to pull open SharePoint Designer and check the exact name of the Read List operation, and I found that there was a space in the method name.

The shim execution failed unexpectedly – Proxy creation failed. Default context not found.

This error will appear if you did not declare the SPServiceContextScope.  You can perform this operation as shown below.  Note that the scope must be declared BEFORE the SPWeb is instantiated:

using (SPSite site = new SPSite(“http://mysite”))
{
   var context = SPServiceContext.GetContext(site);
using (var scope = new SPServiceContextScope(context))
{
      using (SPWeb web = site.RootWeb)
     {
         SPList myList = _web.Lists[“myList”];
SPQuery query = new SPQuery();
….
}
   }
}

For the complete guide to BCS External Lists in SharePoint, download the PDF. Or check out our blog on SharePoint 2013 Task App Lists

SharePoint 2013 Application Almost Complete

For the past few months I have been working on and blogging about SharePoint 2013 and new functionality that allows safer code development as a result of client-side code and SharePoint applications. To prove out this functionality, we decided to put some time into developing an app for performance evaluations that we will both use internally and post for download at the SharePoint store.

That work is now almost done, and Entrance is getting ready to package it up for posting. The application features a graphical user interface (GUI) based on the Knockout JavaScript library, allowing an administrator to create custom roles, sections of the performance evaluation, and questions  in a rue WYSIWYG interface (acronym for what you see is what you get). In addition, as changes are made to the form, they are immediately visible in the DOM (document object model) without the need for a refresh.

6

Another benefit to the way the application has been developed is that once it has been installed in SharePoint, the actual deployment of the performance evaluation solution requires no coding ability. And of course, once the evaluation has been completed and questions are specified for the employee and their manager, the manager is never able to edit the employee’s answers, or vice versa.

The above picture is an example of what the performance evaluation could look like. You can get a more complete view of what the SharePoint 2013 application would look like from start to finish here.

Development of this application was not without its challenges, however. I started out creating this application as several JavaScript lists. I got pretty far with this solution before I realized the impracticality of requiring the creator of a new performance evaluation to hop from several lists, one to create a question, one to input answers to the question, etc.

I backtracked to fix this problem, and instead created a single text field to store the JSON (JavaScript Object Notation) representation of an application. As such, the information inputted in the evaluation is then stored in a single SharePoint list.

Be sure to check out the full set of screenshots I shared above, or you can see what else our SharePoint consultants are working on in other blog posts!