Remove hyperlinks from OOTB list view Web Part using JQuery

SharePoint 2013 list view Web Part display lookup columns as hyperlinks. Sometime these hyperlinks don’t point to something very useful and do a great job of confusing the users. Here’s a simple script to remove all hyperlinks except the Title from a list view.

function DisableLookupLinksInList() {
$("").find("").each(function () {
var link = $(this).find("a");
if (link.length > 0) {
link.replaceWith("<span>" + link.text() + "</span>");

And here the script to remove lookup links from a display form

function DisableLookupLinksInForm() {
$("").find("").each(function () {
var link = $(this).find("a");
if (link.length > 0 && link.parent().attr("id") != "SPFieldUserMulti") {
link.replaceWith("<span>" + link.text() + "</span>");


Leave a comment

Customizing SharePoint 2013 OOTB List view using JSLink

JSLink in SharePoint 2013 is a nice and only way to keep all the power of OOTB list view Web Part and add your own customizations. Here’s a simple example of highlighting an item row based on a column value.

(function () {
 var context = {};
 context.Templates = {};

 context.OnPostRender = [HighlightRowOverride];


function HighlightRowOverride(context) {

 for (var i = 0; i &amp;lt; context.ListData.Row.length; i++) {
 var listItem = context.ListData.Row[i];

 if (listItem[&amp;quot;_Status&amp;quot;] == &amp;quot;Change requested&amp;quot;) {
 var iid = GenerateIIDForListItem(context, listItem);
 var row = document.getElementById(iid);

 if (row.length != 0) {



Below is an example of an another customized list view Web Part, the grey table has been added through JSLink.

Pritam Baldota has explained in his MSDN Magazine article different ways of deploying and adding JSLink scripts the list view Web Parts.

Leave a comment

Change SharePoint list item permissions to Read only programmatically

It’s a simple task but keeps slipping my mind, so I though it’s better to save it in the public diary.

So I have a Projects and Tasks master detail lists. When a project is complete, it should become read only together with all its tasks. If it was for only the Project list, I could use the SharePoint designer workflow to change the item permissions.

My projects and tasks lists have ‘Contribute’ and a custom permissions level called ‘Contribute without delete’ assigned to multiple user groups. And I wanted to change all the Contribute access to Read  access upon completion of the project.

Here’s the function I wrote,

public void MakeItemReadonly(SPWeb web, SPListItem item, string permissionToReplace, bool exactMatchOnly)
            List<SPPrincipal> principals = new List<SPPrincipal>();
            foreach (SPRoleAssignment roleAss in item.RoleAssignments)
                foreach (SPRoleDefinition roleDef in roleAss.RoleDefinitionBindings)
                    // condition based on the flag exactMatchOnly 
                    if ((exactMatchOnly?string.Compare(roleDef.Name,permissionToReplace,true)==0: roleDef.Name.Contains(permissionToReplace)))


            SPRoleAssignment assignment;
            SPRoleDefinition role = web.RoleDefinitions.GetByType(SPRoleType.Reader);
            foreach (SPPrincipal principal in principals)
                // remove the role assignment 

                // Now add the read role to the same principal 
                assignment = new SPRoleAssignment(principal);

And called the above function the following way,

MakeItemReadonly(web, listItem, "Contribute", false);

Leave a comment

Problem with multiple HTML properties in user profile

Recently I was configuring user profiles in SharePoint 2013 and I had to add several custom user properties including html fields. All other properties worked find except html ones. Html properties showed up fine on edit profile page, I entered text and saved the profile, but when I opened my profile again for edit only the last property had value and others where empty. After some investigation I figured out that the EditProfile.aspx in 15 hive had JavaScript which can’t fill in multiple html properties, it’s a bug which has not been fixed until December 2013.

I had three properties on the page, biography, qualifications and expertise, as in the picture below


EditProfile.aspx contains the values of properties in hidden fields as;

<input name="ProfileEditorEditBiography_hiddenRTEField" id="ProfileEditorEditBiography_hiddenRTEField" type="hidden" value="Bio"/>

<input name="ProfileEditorEditQualifications_hiddenRTEField" id="ProfileEditorEditQualifications_hiddenRTEField" type="hidden" value="Qualification"/>

<input name="ProfileEditorEditExperties_hiddenRTEField" id="ProfileEditorEditExperties_hiddenRTEField" type="hidden" value="Skills and stuff"/>

The JavaScript code the edit profile page generates to fill the properties is


The problem in the above code is obvious, it has three functions which are supposed to set values in biography, qualification and expertise fields, but all three functions have the same name. When they get pushed into _spBodyOnLoadFunctionNames, the second push call overwrites the first one and the third push overwrites the second function in the stack, leaving only the last function in the stack to be called.

The solution was to modify this page, and add my own javascript code, which would set proper values to proper fields.

Here’s the code I added inside AdditionalPageHead to fix the problem.

<script type="text/javascript">


function RePopulateEditableRegion(){

var editableRegion = document.querySelector('[InputFieldId=ProfileEditorEditBiography_hiddenRTEField]');
if (editableRegion) {
var field = document.getElementById("ProfileEditorEditBiography_hiddenRTEField");
    if (field) {
editableRegion.innerHTML = field.value;

editableRegion = document.querySelector('[InputFieldId=ProfileEditorEditQualifications_hiddenRTEField');
    if (editableRegion) {
var field = document.getElementById("ProfileEditorEditQualifications_hiddenRTEField");
        if (field) {
editableRegion.innerHTML = field.value;

editableRegion = document.querySelector('[InputFieldId=ProfileEditorEditExperties_hiddenRTEField]');
if (editableRegion) {
var field = document.getElementById("ProfileEditorEditExperties_hiddenRTEField");
    if (field) {
editableRegion.innerHTML = field.value;

I will have to keep an eye when this bug is fixed in future updates, if the fix is only the server side, then I will have to remove my javascript and if the fix replaces EditProfile.aspx, then I won’t have to do anything.

1 Comment

Creating List Fields/Columns Programmatically in Sharepoint 2010

Here’s the starting point for creating custom fields in a SharePoint list programmatically, there’s of course much more to do in order to make them behave according to you requirements;


Single Line Text Field

        string fieldInternalName = list.Fields.Add(“fieldname”, SPFieldType.Text, false);

        list.Fields[fieldInternalName].Description = “field description”;



Multiline Text Field

        string fieldInternalName = list.Fields.Add(“fieldname”, SPFieldType.Note, false);


Boolean Field

        string fieldInternalName = list.Fields.Add(“fieldname”, SPFieldType.Boolean, false);


Number Field

        string fieldInternalName = list.Fields.Add(“fieldname”, SPFieldType.Number, false);

        SPFieldNumber fieldTimeSpent = new SPFieldNumber(list.Fields, fieldTimeSpentName);

        fieldTimeSpent.DisplayFormat = SPNumberFormatTypes.NoDecimal;



Choice Field

        string fieldStatusName = list.Fields.Add(“Status”, SPFieldType.Choice, false);

        SPFieldChoice fieldStatus = (SPFieldChoice)list.Fields.GetFieldByInternalName(fieldStatusName);

        string[] activityTypes = { “Active”, “Closed” };


        fieldStatus.DefaultValue = “Active”;



User Field

        string fieldUserName = list.Fields.Add(“User”, SPFieldType.User, false);

        SPFieldUser userField = new SPFieldUser(list.Fields, fieldUserName);

        userField.AllowMultipleValues = false;

        userField.Required = true;

        userField.SelectionMode = SPFieldUserSelectionMode.PeopleOnly;

        userField.LookupField = “Title”;



Date Time Field

        string fieldInternalName = list.Fields.Add(“fieldname”, SPFieldType.DateTime, false);

        SPFieldDateTime fieldDateTime = new SPFieldDateTime(list.Fields, fieldInternalName);

        fieldDateTime.DisplayFormat = SPDateTimeFieldFormatType.DateOnly;

        fieldDateTime.DefaultValue = “[today]”;



Lookup Field

        SPList listMain = currentWeb.Lists.TryGetList(“MainList”);

        SPList listActivity = currentWeb.Lists.TryGetList(“Activities”);


        string fieldActivityName = listMain.Fields.AddLookup(“Activity”, listActivity.ID, false);

        SPFieldLookup activityField = new SPFieldLookup(listMain.Fields, fieldActivityName);

        activityField.AllowMultipleValues = false;

        activityField.LookupField = “Title”;

        activityField.Indexed = true;

        activityField.RelationshipDeleteBehavior = SPRelationshipDeleteBehavior.Restrict;



Lookup Additional Field

        string fieldActivityIdName = listMain.Fields.AddDependentLookup(“Activity:ID”, activityField.Id);

        SPFieldLookup fieldLookup = (SPFieldLookup)listMain.Fields.GetFieldByInternalName(fieldActivityIdName);

        fieldLookup.LookupField = listActivity.Fields[“ID”].InternalName;



Modifying Default View

        var view = list.DefaultView;







        view.ViewFields.MoveFieldTo(“ID”, 0);

        view.ViewFields.MoveFieldTo(“field1”, 2);

        view.ViewFields.MoveFieldTo(“field2”, 3);


1 Comment

Different views for display, edit and new item in InfoPath list forms

Custom lists and InfoPath forms make a good combination, although InfoPath in this scenario lacks some functionality but still this combination is hard to avoid in many situations. You can check out my previous post about the differences between InfoPath in form library, InfoPath with custom lists and aspx forms for custom lists.

When working with InfoPath custom list forms it’s sometimes required to have different views for new, edit and display item modes of the form.

Display View

There are two ways you can choose display view otehr than the default view.

First is in “advanced form options” in InfoPath file menu, here you can choose your display view.


Advanced form options

Advanced form options



Second options is outside InfoPath and it applies not only to display mode but also to edit and new modes.

Suppose you want a different view for display item mode.

1. Open the site in SP Designer

2. Open list detail page and open displayifs.aspx in ‘Forms’ list

3. Select the Infopath viewer webpart and look in the properties window, you will find the “DefaultView” property inside “Misc” section

Same can be done in newifs.aspx and editifs.aspx for new and edit item modes


New Item View

It’s easy just check empty ID field in InfoPath rule on form load and change view. Or use the above mentioned designer option.


Edit Item View

If you have set different display view and switching view for new item on form load based on empty ID field, then for edit item mode just leave it to the default view. And of course you can change in SP designer as mentioned above.


Leave a comment

Comparison between Aspx forms, InfoPath list forms and InfoPath documents in SharePoint 2010

When it comes to data entry forms in SharePoint, there are three out of the box options available, Aspx forms (default option in lists), InfoPath List forms, and InfoPath documents. The first two are interchangeable with some effort, but switching from the first two to InfoPath documents and visa versa is not possible. Therefore, it’s important to choose the right approach in the beginning of a project.

Here’s the comparison of these three technologies.


ASPX forms

InfoPath List Forms

InfoPath Documents 


Separate forms for display, edit and new items. Forms simply work on whatever data is in the list.

Single form works for all operations. Like aspx forms, this form works on whatever data is in the list.

Each list/data item is a document itself. Documents can be configured to promote fields to library columns

Form cannot be printed

Form cannot be printed

Form CAN BE printed

Data cannot be saved as draft

Data cannot be saved as draft

Document can be saved as draft


Coding Support

Client and server side code support

No client or server side code support

Only server side code support, it uses XMLHttp in order to avoid full page postbacks during data entry.


Form Design

CSS can be applied

No CSS support

No CSS support



Data can be changed or imported into the list in bulk

Data can be changed or imported into the list in bulk

Only existing data in promoted fields can be modified. Records cannot be added or deleted in bulk.

Multiple data sources are not supported unless they are in the form of lookup columns or used in client or server side code

Multiple data sources can be used

Multiple data sources can be used

Managed Meta data can be mapped to fields

Can NOT use Managed Meta data

Can NOT use Managed Meta data

Can use external data through client or server side code

Can consume simple SOAP and REST based services and can have connections to databases and XML files

Can consume simple SOAP and REST based services and can have connections to databases and XML files


Form Functionality

No built in support for cascading drop downs, this functionality is achieved using JavaScript


Cascading drop downs can be created without code

Cascading drop downs can be created without code

No repeating or nested data support

No repeating or nested data support

Repeating and nested data support, but cannot be promoted to separate columns or lists

Multiple views of data cannot be created

Multiple view of data CAN BE created and switched based on rules

Multiple view of data CAN BE created and switched based on rules

Multiple web part can be added to the form, inline editing of records possible

Data can be shown from multiple data sources, but can’t be changed

Data can be shown from multiple data sources, but can’t be changed



JavaScript for all the rules and client side validation

Rule engine does it all

Rule engine does it all



SPD based list and reusable workflows and VS based custom workflows can be created and attached

SPD based list and reusable workflows and VS based custom workflows can be created and attached

SPD based list and reusable workflows and VS based custom workflows can be created and attached. Only promoted fields can be used in SPD based workflows.


Key Benefits

Maximum control on the form

Very easy to develop and very little testing is required

Easy to develop and relatively less testing is required

JavaScript/JQuery and Server side code support

Can be developed with minimum time and effort

Server side code support

CSS Support

InfoPath Views, Rules and facial features are supported

All InfoPath features like Views, Rules, facial features and printing are supported

Data in the list can be edited, imported and exported in bulk

Data in the list can be edited, imported and exported in bulk

Repeating and nesting data support


Multiple web parts can be used on a form to view or modify items from different lists on a single form



Increased development and testing time

No Coding support

No client side coding support, limited server side code ability


Can run in Sandbox



Deciding the right technology

 InfoPath form library should be the first consideration for all kind of applications. They provide additional functionality compared to custom list InfoPath forms, such as;

  • Repeating tables and complex schema 
  • Printing views 
  • Better deployment and change support
  • Managed code support 
  • Forms can be digitally signed 


There are few situations where list based InfoPath forms suite;

  •  System needs to be built upon existing data and it’s not feasible for all that data to be entered through the forms
  • Bulk data import and edit is required throughout the life of the system
  • None of the above mentioned additional capabilities of InfoPath is required 


ASPX list forms should be used only when

  •  JavaScript support is a must
  • CSS support is required
  • SharePoint Managed Meta Data must be used in forms






JavaScript page load function array and pre save function in SharePoint 2010

JavaScript page load function

I have been using this function array forever, but still whenever I need it, I have to look it up on internet, so decided to post it here.

In case you are new to SharePoint,  because mostly SharePoint pages don’t contain body element because it comes from master page, so this is the way to run your page body load event code in SharePoint. Add your function name to “_spBodyOnLoadFunctionNames” function array, and your function will be called when page body is loaded.


function pageOnLoad()
// Your code here


Pre Save Custom Script

Another important function which I managed to forget when I was recently customizing a list item page, is PreSaveItem function. It is for writing custom client side script when “Save” button is pressed on New or Edit Item page in SharePoint.

function PreSaveItem()
return true // or return false;

Return true of you want the saving process to continue or return false otherwise.

Get Element by Tag and  Title

One more very useful function is the one which gets an element by its tag name and title, here it is

function getElementFromTitle(tagName, title)
     var tags = document.getElementsByTagName(tagName);   
     for (var i=0; i < tags.length; i++)   
         if (tags[i].title == title)      
             return tags[i];      
     return null;

But if you are using JQuery, the following line replaces the above function

var subjectValue = $("input[title='ElementTitle']").val();

(“input” is the type of control)

Using JQuery you can go to any length to find something in the page markup, like the one below returns text from rich text field in SharePoint

var descriptionValue = $("textarea[Title='ElementTitle']").closest("span")
  .find("iframe[Title='Rich Text Editor']").contents().find("body").html();


SP Services by Marc D Anderson

Here’s some cool stuff by Marc D Anderson

This is a library which is based on JQuery, it makes making cascading drop downs amazingly easy.

After you have referenced JQuery and SPService in your page, it’s just the following code which configures a cascading drop down

<script type="text/javascript">
    $(document).ready(function() {
            relationshipList: "Regions",
            relationshipListParentColumn: "Country",
            relationshipListChildColumn: "Title",
            parentColumn: "Country",
            childColumn: "Region"

Thanks Marc, for this amazing stuff.


Add a background image and a CSS to page in SharePoint 2010

Adding a background image to a page in SharePoint is easy, open the page in SharePoint Designer, and add the following style inside “PlaceHolderAdditionalPageHead” content place holder.
.ms-bodyareacell {
     BACKGROUND-IMAGE: url(‘imageurl‘);


Here’s my attempt to change the page background

And of course “background-repeat” and “background-position” can be used if required.

This style can also go to a CSS file, which can be added by adding a link inside the same placeholder.

css” href=”css url” />

which will look like this

CSS can be in Style Gallery or Site Assets or anywhere else inside SharePoint or in Layouts folder in 14 hive.

If you don’t remember this link attributes and their values then in page design mode, click anywhere on the page and you will get an option to “Attach an Style Sheet” to the page in “Style” tab of the ribbon. This way it will let you browse for the CSS and will create the same link element in  the page.

If you want to add a new CSS file in “Site Assets” folder, you get an “Asset” option in the “New” ribbon group when “Site Assets” folder is selected

1 Comment

List Tools tab disappears from list page in SharePoint 2010

List pages in SharePoint contain “List Tools” tab on top of the page, and a drop down to let us select different views of the list, these are helpful function and we quickly get used to them. 

But they are taken out if another web part is added on the page, even if it’s hidden or it’s empty.

It makes sense, because  when another web part is added, the page doesn’t remain a list page anymore and all the list specific options are taken out.