How to Create a Custom Announcements List using JSLink in SharePoint
With many clients that I have worked with, one common occurrence is the capability to be able to have announcements on their intranet home page. They want an easy-to-use experience for users to be able to add content, but for the look and feel to better suit the needs of their business.
Here is an example of a simple Announcements experience you can use for your users that is list-driven.
First Step, you need to create the “Announcements” list.
Create the following columns:
- Title
- PubDate
- News Summary
- News Author
- News Image
The code – create a javascript file:
(function () { //Convert the input date 'item' to a Javascript Date object function convertPubDate(d) { return ( d.constructor === Date ? d : d.constructor === Array ? new Date(d[0], d[1], d[2]) : d.constructor === Number ? new Date(d) : d.constructor === String ? new Date(d) : typeof d === "object" ? new Date(d.year, d.month, d.date) : Nan ); } //Return full name of month function getMonthName(mon) { switch (mon) { case 0: return "January"; case 1: return "February"; case 2: return "March"; case 3: return "April"; case 4: return "May"; case 5: return "June"; case 6: return "July"; case 7: return "August"; case 8: return "September"; case 9: return "October"; case 10: return "November"; case 11: return "December"; } } //Get formatted date string (e.g. January 1, 1970) function formatAnnDate(d) { return getMonthName(d.getMonth()) + " " + d.getDate() + ", " + d.getFullYear(); } function getImageSource(currentItemImage) { var imageTag = ''; if (currentItemImage !== null && currentItemImage !== '') { var htmlDoc = document.implementation.createHTMLDocument(''); htmlDoc.body.innerHTML = currentItemImage; var imgWrapper = htmlDoc.body.children; if (imgWrapper.length > 0 && imgWrapper[0].children.length > 0) { var image = imgWrapper[0].children[0]; var imgSrc = image.getAttribute('src'); if (imgSrc !== null) { imgSrc = imgSrc.split('?')[0] + '?height=100&width=100'; image.setAttribute('src', imgSrc); image.setAttribute('class', 'announcement-img'); image.removeAttribute('width'); image.removeAttribute('height'); imageTag = image.outerHTML; } } } return imageTag; } var NewsOverride = { Templates: { Header: function (ctx) { return "<div class='" + ctx.ListTitle.toLowerCase().replace(/[\s|_]/g, "-") + "'>"; }, Item: function (ctx) { var ListTitle = ctx.ListTitle.toLowerCase().replace(/[\s|_]/g, "-"); var HTML = ""; switch (ListTitle) { case "announcements": HTML += " <div class='item clearfix'>\ <img class='announcement-image' src='{{Image}}' />\ <div class='announcement-content'>\ <h4><a href='{{displayURL}}'>{{Title}}</a></h4>\ <p class='date'> {{Date}}</p>\ <p class='description'> {{Description}}</p>\ </div>\ </div>" .replace(/{{Title}}/g, ctx.CurrentItem.Title) .replace(/{{Date}}/g, ctx.CurrentItem.Publish_x0020_Date) .replace(/{{Description}}/g, ctx.CurrentItem.Description) .replace(/{{Image}}/g, ctx.CurrentItem.NewsImage) .replace(/{{displayURL}}/g, "https://meetdux.sharepoint.com/sites/doitt/Lists/"+ctx.ListTitle+"/dispform.aspx?ID="+ctx.CurrentItem.ID); break; case "members": HTML += " <div class='item clearfix'>\ <img class='member-img' src='{{Image}}'>\ <div class='member-content'>\ <h4><a href='{{displayURL}}'>{{Title}}</a></h4>\ <p class='name'> {{Name}}</p>\ <p class='company'>{{Agency}}</p>\ <p class='email'>{{email}}</p>\ <p class='phone'>{{Phone}}</p>\ </div>\ </div>" .replace(/{{Title}}/g, ctx.CurrentItem.Title) .replace(/{{Name}}/g, ctx.CurrentItem.Name) .replace(/{{Image}}/g, ctx.CurrentItem.Image) .replace(/{{Agency}}/g, ctx.CurrentItem.Agency) .replace(/{{email}}/g, ctx.CurrentItem.Email) .replace(/{{Phone}}/g, ctx.CurrentItem.Phone) .replace(/{{displayURL}}/g, "https://meetdux.sharepoint.com/sites/doitt/Lists/"+ctx.ListTitle+"/dispform.aspx?ID="+ctx.CurrentItem.ID); break; } return HTML; }, Footer: function (ctx) { if (ctx.ListData.Row.length == 0) { return "<p class=\"NoAnnouncements\">There is currently no news.</p></div>"; } else { return "</div>"; } } }, ListTemplateType: 100, BaseViewID: 1 }; if (typeof SPClientTemplates != "undefined") { SPClientTemplates.TemplateManager.RegisterTemplateOverrides(NewsOverride); } })();
Insert the url for the javascript file into the edit panel of the list webpart. Be sure to include the "~" at the beginning. It will require accessing the root site for the url to work. After completing, your new announcements experience is ready for use.