- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-17-2018 12:06 PM
Hello -
When I use the KB - Categories - KBv3 Widget in Service Portal and click on a specific Knowledge Base category, it appears to be sorting the articles on the articles category, on the KB Category Page widget. I was wondering if there was a way that I could get these articles to sort/order on the Short Description of the Knowledge Article instead of the current way it is sorting.
I am not sure if this sort is controlled in the KB Categories - KBv3 widget or if it is happening in the KB Category Page widget, and how I can update this. The SC Categories widget and SC Category Page widget are properly sorting on the name of the Catalog Item, I was hoping to achieve a similar result with the KB widgets.
Thanks!
Solved! Go to Solution.
- Labels:
-
Service Portal Development
- 7,199 Views
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-15-2018 08:56 PM
Hi @jlaue,
This is my way:
- Clone KB Category Page widget (example: KB Category Page v1.0)
- Update HTML code as below:
<div> <div ng-if="data.categoryExists" class="panel panel-{{::options.color}} b"> <div class="panel-heading"> <h2 class="panel-title">{{data.categoryDisplay}}</h2> </div> <div role="list" class="panel-body"> <div ng-if="data.items.length == 0"> (${No articles}) </div> <div role="listitem" ng-repeat="kb_article in data.items | orderBy : 'title'" class="sp-kb-topic-article m-b-lg"> <a ng-href="?id=kb_article&sys_id={{::kb_article.sys_id}}">{{::kb_article.title}}</a> <div style="max-height: 3em; overflow: hidden; padding-top:4px;" aria-label="{{::c.getShortenText(kb_article.text)}}">{{::kb_article.text}}</div> <div class="kb-about" style="padding-top:4px;"> <span class="about-outer-span"> <span class="author pad-right" ng-if="kb_article.author"> <glyph sn-char="user" class="pad-right" aria-hidden="true"/> ${Authored by {{::kb_article.author}}} </span> <span ng-if="kb_article.sys_view_count == 1" class="views pad-right"> <span class="pad-right">•</span> <glyph sn-char="eye-open" class="pad-right" /> ${{{::kb_article.sys_view_count}} View} </span> <span ng-if="kb_article.sys_view_count > 1" class="views pad-right"> <span class="pad-right">•</span> <glyph sn-char="eye-open" class="pad-right" /> ${{{::kb_article.sys_view_count}} Views} </span> <span class="published pad-right"> <span class="pad-right" aria-hidden="true">•</span> <glyph sn-char="calendar" class="pad-right" aria-hidden="true" /> <sn-day-ago date="kb_article.published"/> </span> <span ng-if="data.showStarRating && kb_article.rating"> <span class="pad-right">•</span> <uib-rating ng-model="::kb_article.rating" max="5" readonly="true" aria-label="${Article rating} - ${Read Only}"/> </span> </span> </div> </div> </div> </div> </div>
Note: my idea is using orderBy of AngularJS
<div role="listitem" ng-repeat="kb_article in data.items | orderBy : 'title'" class="sp-kb-topic-article m-b-lg"> - Go to kb_category page and replace OOB widget by new widget
And this is the result.
Hope this will help.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-16-2018 12:01 PM
Hi All,
I know there is a solution for this, but yesterday I found another solution as well, slightly shorter.
We still update the OOTB widget 'KB Category Page' to create a copy and re-point your container to the new widget.
In the 'Client Controller' script just add lines 6-9 to the script, the section that starts with the comment, see below:
function ($scope, $rootScope, $timeout, spKBCategoryService) {
var accessWordCountMax = 15;
var c = this;
init();
// opus change - sort documents by title name
c.data.items.sort(function (a, b) {
return a.title.localeCompare(b.title);
});
c.getShortenText = function getShortenText(text) {
var wordsArray = text.split(" ");
if (wordsArray.length > accessWordCountMax)
wordsArray = wordsArray.slice(0, accessWordCountMax);
return wordsArray.join(" ");
}
and that's it, works great!
I'm trying to get this working on the 'server script' so it's not run on the client side, if I find a solution I'll update this thread.
Hope this helps someone.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-16-2018 02:36 PM
ALso Seth assisted me with code to get the Category sort working on the 'Server Script' so it doesn't run on the client side.
Check out the community article below:
Cheers
Carl.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-16-2018 08:44 PM
I have a slightly better solution - this runs on the server script, not the client controller, so it runs server side and won't impact the client loading times.
Server script for 'KB Category Page' is:
//CJF 17-05-18 Opus - Updated code to sort documents by title to run server side
data.items.sort(function(a,b) {
// below code works, but localCompare will work for all locales/languages
//return (a.title.toLowerCase() > b.title.toLowerCase()) ? 1 : ((b.title.toLowerCase() > a.title.toLowerCase()) ? -1 : 0);
return a.title.localeCompare(b.title);
});
both lines starting with 'return' will work, but as per the comments the localCompare provides more handling cases for language/locale.
Server script for 'KB Categories V3' is:
//CJF 17/05/18 Opus new code to sort the Categories alphabetically by label name
data.categories.sort(function(a,b) {
// below code works, but localCompare will work for all locales/languages
//return (a.label.toLowerCase() > b.label.toLowerCase()) ? 1 : ((b.label.toLowerCase() > a.label.toLowerCase()) ? -1 : 0);
return a.label.localeCompare(b.label);
});
Hope this helps!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-17-2018 12:59 AM
Hi @Carl Fransen,
Your solution is good performance, and I agree array should be sorted at server-side instead of client-side.
I have enhanced code for this widget:
- Clone KB Category Page widget (example: KB Category Page v1.0)
- Update Server-script code as below (append code):
/****************sorting list article**********************/ data.sortBy = options.sortBy || "short_description"; data.sortDesc = options.sortDesc == "true" || false; data.items = sortArticles(data.items,data.sortBy,data.sortDesc); function sortArticles(arr,field,desc){ try{ arr.sort(function(a, b) { var compare = a[field].localeCompare(b[field]); if(desc){ if(compare == 1){ compare = -1; } else{ compare = 1; } } return compare; }); }catch(err){ console.log("***ERROR: " + err); } return arr; }
- Go to kb_category page and replace OOB widget by new widget
- Open instance widget and add some options:
Note: currently, sort method is only supported for string
"sortBy" {String}: field name which you want to sort (example: number,title,short_description...)
"sortDesc" {Bool}: 'true' if you want to desc sort
Hope this is useful.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-21-2018 07:18 AM
Hi Jack/Carl -
I was wondering if one of you would be able to help me with a similar issue with a different widget. I posted this on:
Thanks so much!!
J