JS Links

This post will give an overview of JSLinks. JSLinks provide the ability to override the Client-Side Rendering (CSR) templates for SharePoint list fields, forms and views. To view the raw code, here is a link to the github project.

JSLink References

SharePoint Objects

SharePoint 2013 introduced the JSLink property to many objects. The following is a list of SharePoint object types that have the JSLink property:
* SPContentType
* SPForm
* SPView
* Web Parts
* BaseXsltListWebPart
* ListFormWebPart
* PromotedSitesViewWebPart
* TilesViewWebPart
* SPField
* OutComeChoiceField
* RelatedItemsField
* SPFieldAttachments
* SPFieldBoolean
* SPFieldCalculated
* SPFieldChoice
* SPFieldCurrency
* SPFieldDateTime
* SPFieldDecimal
* SPFieldFile
* SPFieldGeolocation
* SPFieldLookup
* SPFieldMultiChoice
* SPFieldMultiLineText
* SPFieldNumber
* SPFieldText
* SPFieldUrl
* SPFieldUser
* TaxonomyField

URL Wildcards

The JSLink property MUST be a relative url or use a wildcard. For example, “https://sharepoint.com/siteassets/jslinkfile.js” will not be loaded, but “/siteassets/jslinkfile.js” would be loaded. The following wild cards are available:
* ~site – The relative url to the current web.
* ~sitecollection – The relative url of the root web of the current site collection.
* ~layouts – The relative url to the virtual layouts folder.
* ~sitelayouts – The relative url to the layouts folder of the current web.
* ~sitecollectionlayouts – The relative url to the layouts folder of the root web of the current site collection.

Loading Multiple Scripts

The JSLink property uses the ‘|’ as a delimiter for loading multiple script files.

Client-Side Rendering (CSR) Template Overrides

Template Manager

The template manager is used to register overrides and apply customizations to the SharePoint object. The following are a list of properties available to override:
* BaseViewID
* New Form
* Edit Form
* Display Form
* ListTemplateType
* Templates
* OnPreRender
* OnPostRender

Template

The template contains the following properties to override:
* Header
* Footer
* Body
* Item
* Group
* Fields
* NewForm
* EditForm
* DisplayForm
* View
* OnPreRender
* OnPostRender

List Customizations

This section will give an overview of the customizing areas of a SharePoint List. The developer is able to customize the html of the following areas:
* Content Type
* New Form
* Edit Form
* Display Form
* Field
* New Form
* Edit Form
* Display Form
* View
* View
* Header Area
* Footer Area
* Item Area
* Body Area
* Group Area

Content Type

The content type object JSLink property can be used to customize the following areas:
* New Form
* Edit Form
* Display Form

CSR Content Type Template

The CSR template for the list form is:
* View – The function to override the form completely. This requires the List Form webpart(s) “Form Template Name” property to be set to be updated from “ListForm” to “CSRListForm”.
* OnPreRender – The event called before the field is rendered.
* OnPostRender – The event called after the field is rendered.

Field

The field object JSLink property can be used to customize the following areas:
* New Form
* Edit Form
* Display Form
* List View

CSR Field Template

The CSR template for each field is:
* [Field Internal Name]
* NewForm
* EditForm
* DisplayForm
* View

View

The view object JSLink property can be used to customize the following areas:
* Header
* Footer
* Item
* Body
* Group

CSR View Template

The CSR template for the view is:
* Header
* Footer
* Item
* Body
* Group
* OnPreRender
* OnPostRender

gd-sprest NPM Library

The gd-sprest library has been used to register and demonstrate various JSLink customizations. The library has a JSLink template builder to help minimize the amount of code required to write. The library also has helper methods for customizing the field, form and view. Below is the minimal template for registering a CSR override.

Code Template
"use strict";

/**
 * JSLink: [ClassName] Customization
 */
var [ClassName] = (function () {
    /**
     * Methods
     */

    /**
     * Initialization
     */
    function init() {
        var jsLink = new $REST.JSLink();

        // Set the template
        jsLink.Templates = {
                    // Template overrides go here
        };

        // Register the template
        jsLink.register();
    }

    /**
     * Public Interface
     */
    return {
        init: init
    };
})();

// Write the javascript to initialize the CSR override. This will ensure it's called when MDS is enabled
document.write("<script type='text/javascript'>(function() { [ClassName].init(); })();</script>");

Example

I created a github project to use as a reference for this post. This project uses the Visual Studio SharePoint Add-In project type.

List

The first thing I did was create a demo list called “Demo”. This list has one custom choice field called “Group”. A custom view called “JS Link” was created to demonstrate the various areas to customize.

Apply JSLink

To apply customizations to these objects, I updated the Schema.xml file and added the JSLink property to the following objects:
* Content Type

    <ContentTypes>
      <ContentType ID="0x01CC4335B8F351436FA8D01DCC020F4AF7" JSLink="~site/node_modules/gd-sprest/dist/gd-sprest.min.js|~site/Scripts/form.js">
        <FieldRefs>
          <FieldRef ID="{fa564e0f-0c70-4ab9-b863-0177e6ddd247}" Name="Title" />
          <FieldRef ID="{99bff9c3-9d84-4870-adcf-601720461f6d}" Name="GroupType" />
        </FieldRefs>
        <Folder TargetName="Item" />
      </ContentType>
      <ContentTypeRef ID="0x0120" />
    </ContentTypes>

Note – By default the ContentTypeRef is used, but you can use the “Create GUID” tool and change the element from “ContentTypeRef” to “ContentType” and update the “ID” attribute appending the GUID.

  • Group Type Field
      <Field ID="{99bff9c3-9d84-4870-adcf-601720461f6d}" Type="Choice"
             Name="GroupType" StaticName="GroupType" DisplayName="Group"
             JSLink="~site/node_modules/gd-sprest/dist/gd-sprest.min.js|~site/Scripts/field.js">
        <CHOICES>
          <CHOICE>Group 1</CHOICE>
          <CHOICE>Group 2</CHOICE>
          <CHOICE>Group 3</CHOICE>
        </CHOICES>
      </Field>
  • “JS Link” View
      <View BaseViewID="2" Type="HTML" WebPartZoneID="Main" DisplayName="JSLink" MobileView="TRUE" SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/15/images/generic.png?rev=23" Url="JSLink.aspx">
        <Toolbar Type="Standard" />
        <XslLink Default="TRUE">main.xsl</XslLink>
        <JSLink>clienttemplates.js|~site/node_modules/gd-sprest/dist/gd-sprest.min.js|~site/scripts/view.js</JSLink>
        <RowLimit Paged="TRUE">30</RowLimit>
        <ViewFields>
          <FieldRef Name="LinkTitle"></FieldRef>
        </ViewFields>
        <Query>
          <GroupBy>
            <FieldRef Name="GroupType" />
          </GroupBy>
          <OrderBy>
            <FieldRef Name="GroupType" />
            <FieldRef Name="Title" />
          </OrderBy>
        </Query>
        <ParameterBindings>
          <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" />
          <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_DEFAULT)" />
        </ParameterBindings>
      </View>

field.js

The field script registers an override for the edit form and view. Setting an override at the field level, will ensure it’s applied to ever list view. Below is the code sample for registering this customization.

        var jsLink = new $REST.JSLink();

        // Set the template
        jsLink.Templates = {
            Fields: [
                {
                    Name: "GroupType",
                    EditForm: (ctx, field) => { $REST.Helper.JSLink.hideField(ctx, field, true); },
                    View: $REST.Helper.JSLink.disableQuickEdit
                }
            ]
        };

        // Register the template
        jsLink.register();

form.js

The form script registers an override to the “Title” field in the new form. Below is the code sample for applying a default value to the “Title” field.

    // Method to set the default value
    function setDefaultValue(ctx, field) {
        // Default the value
        ctx.CurrentFieldValue = "Gunjan";

        // Render the field
        return $REST.Helper.JSLink.renderField(ctx, field);
    }

    /**
     * Initialization
     */
    function init() {
        var jsLink = new $REST.JSLink();

        // Set the template
        jsLink.Templates = {
            Fields: [
                {
                    Name: "Title",
                    NewForm: setDefaultValue
                }
            ]
        };

        // Register the template
        jsLink.register();
    }

view.js

The view script registers an override to all the areas it can customize. It will place a color block before and after the default areas. Below is the code sample for applying these overrides.

        var jsLink = new $REST.JSLink();
        jsLink.Templates = {
            BaseViewId: 2,
            Body: body,
            Footer: footer,
            Group: group,
            Header: header,
            Item: item
        };

        // Register the template
        jsLink.register();

Demo

The example github project will apply the following customizations:
* Default the “Title” field in the new form
* Disable the ability to edit the field in all views
* Highlight the available areas in the “JS Link” list view

Default Field Value

Default Field Value

Disable Edit in List View

List View (Read)

List View

List View (Edit)

Disable Quick Edit

Highlight List View Customization Areas

View w/ No Items

View With No Items

View w/ Items

View With Items

Conclusion

I hope this post has been helpful for those applying customizations through JSLinks.

Leave a Reply

Your email address will not be published. Required fields are marked *