- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-22-2020 03:01 AM
I want to create an incident when user clicks on this button("I have same issue") in knowledge base.Knowledge base has a field named parent incident having an incident.Requirement is that the description and short description will be same as description and short description of parent incident on knowledge base and newly created incident's parent incident field will be same as knowledge base's parent field
Solved! Go to Solution.
- Labels:
-
Service Catalog
-
Service Portal
-
Workflow
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-26-2020 10:05 PM
Got the solution:
HTML:
<div class="kb-article-wrapper">
<div ng-if="data.versionWarningMessage && c.options.show_version_info != 'false'" class="alert alert-info alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<div ng-bind-html="data.versionWarningMessage">
</div>
</div>
<div ng-if="::data.isValid" ng-class="c.isMobile ? 'kb-mobile' : 'panel panel-default kb-desktop'">
<div class="kb-panel-heading" ng-class="{'panel-heading' : !c.isMobile}">
<span ng-class="{'panel-title' : !c.isMobile}">
<div class="row">
<span class="col-md-5 kb-panel-title-header">
<div class="kb-number-info">
<span>{{data.number}}</span>
<span ng-if="!c.isMobile && data.showHistory && c.options.show_version_info != 'false'"> - <a ng-click="c.toggleVersions()" href="javascript:void(4)" aria-label="{{data.versionInfoLabel}}"> {{data.versionInfo}}</a> </span>
<span ng-if="!c.isMobile && data.workflowState">{{data.workflowState}}</span>
</div>
</span>
<div ng-if="!c.isMobile && !$root.hideFeedbackOptions && c.options.hide_all_actions != 'true'" class="col-md-7 kb-end-buttons">
<div class="dropdown kb-end-buttons">
<span class="hidden-sm hidden-xs" ng-if="!data.externalArticle">
<a tabindex="0" ng-mouseover="c.handleSubscribeButtonFocus()"
ng-if="data.properties.isSubscriptionEnabled"
ng-mouseleave="c.handleSubscribeButtonBlur()"
ng-focus="c.handleSubscribeButtonFocus()"
ng-blur="c.handleSubscribeButtonBlur()"
role="button"
class="btn btn-default kb-subscribe" ng-click="c.handleSubscription()" href="javascript:void(5)">
<span class="kb-sub-icon" aria-label="{{data.subscribeLabel}}">
{{data.subscribeLabel}}
</span>
</a>
</span>
<button ng-if="c.data.status" name="createincident" ng-click="c.createIncident()">
I have same issue
</button>
<button ng-if="c.showAttachArticle()" class="btn btn-default" type="button" ng-click="c.attachToTask()" aria-label="{{::data.messages.ATTACH_TO_TASK_LABEL}}">{{::data.messages.ATTACH_TO_TASK_LABEL}}</button>
<button ng-if="c.showActionMenu() && !$root.readOnly" class="btn btn-default dropdown-toggle kb-dropdown-button" type="button" data-toggle="dropdown" aria-label="{{::data.messages.ACTION_MENU}}">
<span class="glyphicon glyphicon-option-horizontal kb-action-menu-padding"></span>
</button>
<ul id="kbActionMenuList" class="dropdown-menu dropdown-menu-right">
<li class="kb-menu-entry hidden-md hidden-lg visible-sm visible-xs" ng-if="data.properties.isSubscriptionEnabled && !data.externalArticle">
<a ng-mouseover="c.handleSubscribeButtonFocus()"
ng-if="data.properties.isSubscriptionEnabled && c.options.hide_subscription != 'true'"
ng-mouseleave="c.handleSubscribeButtonBlur()"
ng-focus="c.handleSubscribeButtonFocus()"
ng-blur="c.handleSubscribeButtonBlur()"
href="javascript:void(6)"
ng-click="c.handleSubscription()">
<span class="kb-sub-icon" aria-label="{{data.subscribeLabel}}">
{{data.subscribeLabel}}
</span>
</a>
</li>
<li class="kb-menu-entry" ng-if="c.showFlagArticle"><a href="javascript:void(1)" data-toggle="modal" ng-click="c.launchFlagModal()">{{data.messages.FLAG_ARTICLE}}</a></li>
<li class="kb-menu-entry" ng-if="c.showCreateIncident"><a target="_blank" href="{{c.createIncidentURL}}">{{c.createIncidentLabel}}</a></li>
<li class="kb-menu-entry" ng-if="data.properties.isEditable" ><a target="_blank" href="kb_knowledge.do?sys_id={{data.article_sys_id}}&sysparm_stack={{c.stackUrl}}">{{data.messages.EDIT}}</a></li>
</ul>
</div>
<!-- Flag article modal -->
</div>
</div>
</span>
</div>
<div class="kb-wrapper" ng-class="c.isMobile ? 'kb-mobile' : 'panel-body kb-desktop'">
<div id="kbVersionInfo" class="kb-version-info" style="display:none" ng-if="!c.isMobile && data.showHistory && c.options.hide_version_info != 'true'" class="kb-version-info">
<div class="kb-version" ng-repeat="version in data.versionList">
<span ng-if="!version.isCurrent"><a href="?id=kb_article_view&sys_kb_id={{version.sysId}}" aria-label="{{version.versionLabel}}">{{version.versionNumber}}</a> - {{version.versionText}}</span>
<span ng-if="version.isCurrent"><b>{{version.versionNumber}} - {{version.versionText}}</b></span>
</div>
</div>
<h2 class="widget-header kb-title-header">{{::data.shortDesc}}</h2>
<div class="kb-language-block pad-right text-nowrap" ng-if="data.langList.length > 1" ng-cloak>
<div class="kb-language">
<div class="dropdown">
<a href="javascript:void(0);" class="dropdown-toggle" aria-label="${Click to view the article in other available languages}" aria-haspopup="true" data-toggle="dropdown">
<span class="lang-icon"><i class="fa fa-globe" aria-hidden="true"></i></span>
<span class="lang-data" ng-class="{'hidden-xs':!c.isMobile}">${{{c.selectedLanguage.label}}}</span>
</a>
<ul class="dropdown-menu dd-right-menu" role="menu">
<li ng-repeat="item in data.langList" role="menuitem"><a title="${{{item.label}}}" role="button" ng-click="c.selectLanguage($index)" href="javascript:void(0);">${{{item.label}}}</a></li>
</ul>
</div>
</div>
</div>
<span class="title-secondary-data">
<span ng-if="data.revisionString" class="author pad-right text-nowrap">
<span ng-if="!c.isMobile && data.langList.length > 1" class="pad-right">•</span>
<i class="fa fa-user pad-right" />
{{data.revisionString}}
</span>
<span ng-if="!c.isMobile && data.externalArticle" class="pad-right text-nowrap">
{{data.messages.EXTERNAL_CONTENT}}
</span>
<br class="visible-xs"/>
<span class="published pad-right text-nowrap">
<span class="pad-right hidden-xs" ng-if="!c.isMobile">•</span> <i class="fa fa-calendar pad-right" />
<sn-time-ago timestamp="data.sys_updated_on"/>
</span>
<span ng-if="data.viewCount == 1" class="views pad-right text-nowrap">
<span class="pad-right">•</span> <i class="fa fa-eye pad-right" />
${{{::data.viewCount}} View}
</span>
<span ng-if="data.viewCount > 1" class="views pad-right text-nowrap">
<span class="pad-right">•</span> <i class="fa fa-eye pad-right" />
${{{::data.viewCount}} Views}
</span>
<span class="text-nowrap str-rating" ng-if="data.properties.showKBStarRating && data.properties.showKBRatingOptions && data.avgRating >= 0" title="{{::data.avgRating}} rating">
<span class="pad-right">•</span>
<span class="kb-rating-stars" ng-if="::c.KBRatingStyle">
<uib-rating sp-rating ng-model="::data.avgRating" max="5" aria-label="{{::data.messages.ARTICLE_RATING}}" aria-hidden="true" readonly="true"/>
</span>
<span class="sp-stars" ng-if="!c.KBRatingStyle">
<span uib-rating sp-rating ng-model="::data.avgRating" max="5" readonly="true" aria-label="{{::data.messages.ARTICLE_RATING}}" aria-hidden="true" state-on="'fa fa-star kb-star-on'" state-off="'fa fa-star kb-star-off'" />
</span>
</span>
</span>
<div class="row community-attribution" ng-if="!c.isMobile && data.hInfo">
<div class="contributor pad-right" ng-if="data.hInfo.contributor && data.hInfo.contributor.userId">
<i class="fa fa-globe" aria-hidden="true"></i>
<span class="pad-lr pad-right" ng-bind-html="data.hInfo.profileMessage"></span>
<span class="discussion-published pad-right pre-bullet-icon text-nowrap" ng-if="data.hInfo.postedOn">
${Posted}<sn-day-ago date="data.hInfo.postedOn"/>
</span>
<span class="discussion-link pad-right pre-bullet-icon text-nowrap" ng-if="data.hInfo.title">
<a href="?id=community_question&sys_id={{data.hInfo.sourceRoot}}" target="_blank_cm1">${Link to Discussion}</a>
</span>
</div>
</div>
<hr class="kb-header-line"/>
<article class="kb-article-content" ng-if="::data.articleType != 'wiki'">
<section ng-if="::!c.data.kbContentData.isTemplate" ng-bind-html="::c.data.kbContentData.data"/>
<section ng-if="::c.data.kbContentData.isTemplate" ng-repeat="field in c.data.kbContentData.data track by $index" style="{{field.field_style}}">
<h3 ng-if="::!field.collapsible" style="{{field.heading_style}}">{{field.label}}</h3>
<header class="collapsible-title" ng-if="::field.collapsible" tabindex="0" ng-click="c.toggleSection(field)">
<h3 style="{{::field.heading_style}}" tabindex="-1">{{field.label}}</h3>
<i class="fa fa-chevron-up rotate" ng-class="{'down': field.collapsed}" tabindex="-1"/>
</header>
<p id="{{::field.column}}" ng-if="::field.type != 'html' && field.collapsed" style="display:none;">{{field.content}}</p>
<p id="{{::field.column}}" ng-if="::field.type != 'html' && !field.collapsed">{{field.content}}</p>
<section id="{{::field.column}}" ng-if="::field.type == 'html' && field.collapsed" style="display:none;" ng-bind-html="::field.content"/>
<section id="{{::field.column}}" ng-if="::field.type == 'html' && !field.collapsed" ng-bind-html="::field.content"/>
</section>
</article>
<article class="kb-article-content" ng-if="::data.articleType == 'wiki'" ng-bind-html="::data.kbWiki"></article>
<hr class="kb-permalink-separator" ng-if="::!c.isMobile"/>
<p class="pull-right kb-permalink" ng-if="::!c.isMobile"><a href="javascript:void(2)" ng-click="c.copyPermalink()">{{::data.messages.COPY_PERMALINK}}</a></p>
</div>
</div>
<div ng-if="!data.isValid && !data.knowledgeExists" class="col-sm-12 panel-warning">
<div class="panel-heading">{{data.messages.RECORD_NOT_FOUND}}</div>
</div>
<div ng-if="!data.isValid && data.knowledgeExists" class="col-sm-12 panel-warning">
<div class="panel-heading">{{data.messages.INSUFFICIENT_PREVILEGES}}</div>
</div>
</div>
<style>
#uiNotificationContainer{
top : 10px;
}
.kb-article-wrapper .kb-desktop .kb-panel-title-header{
padding-left: 25px;
}
.kb-article-wrapper .app-modal-window .modal-dialog {
margin-top: 110px;
}
.kb-article-wrapper .kb-mobile{
letter-spacing: .6px;
}
.kb-article-wrapper .kb-mobile .title-secondary-data{
word-spacing:1px;
}
.kb-article-wrapper .kb-mobile .author{
margin-bottom: 17px;
}
.kb-article-content dl {
margin-top: .2em;
margin-bottom: .5em;
}
.kb-article-content dd {
line-height: 1.5em;
margin-left: 2em;
margin-bottom: .1em;
}
@media only screen and (max-width :992px){
.kb-article-wrapper .kb-desktop{
margin-top:15px;
}
.kb-article-wrapper .kb-wrapper{
padding : 10px !important;
}
.kb-article-wrapper .kb-menu-entry{
padding-top: 2px;
padding-bottom: 2px;
}
.kb-article-wrapper .kb-version-info{
margin-top : 5px !important;
}
.kb-article-wrapper .kb-desktop .kb-number-info{
margin-top : 6px !important;
padding-left: 10px;
}
.kb-article-wrapper .kb-mobile .kb-panel-title-header{
padding-left: 16px;
}
.kb-article-wrapper .kb-desktop .kb-panel-title-header{
padding-left: 0px;
}
}
@media only screen and (max-width :768px){
.kb-article-wrapper .right-col-padding{
padding-left : 25px !important;
}
}
@media only screen and (max-width: 750px) {
.kb-article-wrapper .kb-mobile .author{
margin-bottom: 0px;
}
}
@media only screen and (min-width: 992px) {
.kb-article-wrapper .app-modal-window .modal-dialog {
width: 750px;
}
.kb-article-wrapper .control-label{
float :right;
}
.kb-article-wrapper .left-col-padding{
padding-right : 30px !important;
}
.kb-article-wrapper .right-col-padding{
padding-left : 5px !important;
}
}
@media only screen and (min-width:768px) and (max-width: 992px) {
.kb-article-wrapper .app-modal-window .modal-dialog {
width: 600px;
}
.kb-article-wrapper .control-label{
float :right;
}
.kb-article-wrapper .left-col-padding{
padding-right : 5px !important;
}
.kb-article-wrapper .right-col-padding{
padding-left : 5px !important;
}
}
@media only screen and (max-width: 400px) {
.pad-right{
padding-right:0px !important;
}
}
@media only screen and (max-width: 376px) {
.kb-article-wrapper .kb-mobile{
letter-spacing: 0px;
}
.kb-article-wrapper .kb-mobile .title-secondary-data{
word-spacing:0px;
}
.kb-article-wrapper .kb-mobile .title-secondary-data .str-rating{
margin-top: 17px;
display: block;
}
.kb-article-wrapper .kb-mobile .title-secondary-data .str-rating .pad-right{
display: none;
}
}
</style>
Client Script:
function($rootScope, $scope, $window, $timeout, spUtil, $sce, spModal, $uibModal,$location,cabrillo) {
/* widget controller */
var c = this;
c.createIncident= function(){
c.server.get({action : 'insertincident',article_sys_id : c.data.article_sys_id});
c.data.status = false;
};
if (c.data.redirect) {
var id = $location.search().sys_kb_id ? 'sys_kb_id' : 'sys_id';
if ($location.search()[id] && $location.search()[id] !== c.data.redirect) {
$location.search('spa', 1);
$location.search(id, c.data.redirect);
}
}
if(typeof $rootScope.isOtherPortal == "undefined") {
if($location.search().sys_id != null) {
$rootScope.isOtherPortal = true;
} else {
$rootScope.isOtherPortal = false;
}
}
if(c.data.isValid){
if(c.data.kbContentData && c.data.kbContentData.isTemplate ){
c.data.kbContentData.data.forEach(function(field){
if(field.type == 'html')
field.content = $sce.trustAsHtml(field.content);
});
if (c.data.articleType === 'wiki')
c.data.kbWiki = $sce.trustAsHtml(c.data.kbWiki);
}
else if (c.data.articleType === 'wiki')
c.data.kbWiki = $sce.trustAsHtml(c.data.kbWiki);
else
c.data.kbContentData.data = $sce.trustAsHtml(c.data.kbContentData.data);
}
$scope.submitted = false;
c.flagMessage = null;
$timeout(function(){
$rootScope.$broadcast("sp.update.breadcrumbs", $scope.data.breadCrumb);
});
$rootScope.properties = $scope.data.properties;
$rootScope.messages = $scope.data.messages;
$rootScope.isValid = c.data.isValid;
$rootScope.isKBAdmin = $scope.data.isKBAdmin;
$rootScope.isKBOwner = $scope.data.isKBOwner;
$rootScope.article_sys_id = $scope.data.article_sys_id;
$rootScope.attachments = $scope.data.attachments;
$rootScope.attachedIncidents = $scope.data.attachedIncidents;
$rootScope.affectedProducts = $scope.data.affectedProducts;
$rootScope.displayAttachments = $scope.data.displayAttachments;
$rootScope.hideFeedbackOptions = $scope.data.hideFeedbackOptions;
$rootScope.helpfulContent = $scope.data.helpfulContent;
$rootScope.tableName = $scope.data.tableName;
$rootScope.hasComments = $scope.data.hasComments;
$scope.data.isSubscribed = $scope.data.isArticleSubscribed || $scope.data.isArticleSubscribedAtKB;
$scope.data.subscribeLabel = ($scope.data.isSubscribed ? $scope.data.messages.SUBSCRIBED : $scope.data.messages.SUBSCRIBE);
c.createIncidentURL = c.options.create_task_url || ($scope.data.properties && $scope.data.properties.createIncidentURL);
c.createIncidentLabel = c.options.create_task_prompt || $scope.data.messages.CREATE_INCIDENT;
c.showCreateIncident = c.data.isLoggedInUser && c.options.show_create_incident_action != 'false' && c.data.properties && c.data.properties.showKBCreateIncident && c.createIncidentURL;
c.showFlagArticle = c.data.properties && c.data.properties.showKBFlagArticle && c.data.properties.showRatingOptions;
c.showMenu = c.data.properties && (c.showFlagArticle || c.data.properties.isEditable || c.showCreateIncident);
$rootScope.stackUrl = window.location.pathname + '?id='+c.data.params.sysparm_article_view_page_id+'%26' + (c.data.params.sysparm_article ? 'sysparm_article=' + c.data.params.sysparm_article : 'sys_kb_id=' + c.data.params.sys_kb_id);
c.stackUrl = $rootScope.stackUrl;
c.flagMessage = '';
c.task ={};
c.imageInstance = '';
c.submitFlagWithoutComment = "${Please enter a comment to be able to flag the article}";
c.submitFlagWithComment = "${Press this button to flag the article}";
$scope.data.toggleSubscribed = ($scope.data.isSubscribed ? true : false);
c.reasons = c.data.feedback_reasons;
c.data.reason = '4';
c.imageInstance = '';
c.minImageHeight = parseInt(c.options.min_image_height) || 100;
c.minImageWidth = parseInt(c.options.min_image_width) || 185;
c.readOnly = false;
c.isMobile = spUtil.isMobile() || cabrillo.isNative();
//Use KB specific stylic for "kb" & 'mesp' portal
c.KBRatingStyle = c.options.kb_rating_style || ($rootScope.portal ? ($rootScope.portal.sys_id == "45d6680fdb52220099f93691f0b8f5ad" || $rootScope.portal.sys_id == "26f2fffb77322300454792718a1061e5") : false);
if(c.data.langList && c.data.langList.length > 1){
for(var lng in c.data.langList){
if(c.data.langList[lng].selected == true){
c.selectedLanguage = c.data.langList[lng];
break;
}
}
}
populateBreadCrumbURLs();
function populateBreadCrumbURLs() {
if(c.data.breadCrumb) {
if(c.data.breadCrumb[0].type == 'kb_knowledge_base') {
if($rootScope.isOtherPortal) {
c.data.breadCrumb[0].url = '?id=' + c.data.kb_knowledge_page + '&kb_id=' + c.data.breadCrumb[0].values.kb_knowledge_base;
} else {
c.data.breadCrumb[0].url = '?id=kb_search&kb_knowledge_base=' + c.data.breadCrumb[0].values.kb_knowledge_base;
}
}
for(var i = 1; i < c.data.breadCrumb.length; i++) {
if(c.data.breadCrumb[i].type == 'kb_category') {
if($rootScope.isOtherPortal) {
if(c.data.breadCrumb[i].values.kb_category == "NULL_VALUE") {
c.data.breadCrumb.splice(i, 1);
} else {
c.data.breadCrumb[i].url = '?id=kb_category&kb_id=' + c.data.breadCrumb[i].values.kb_knowledge_base + '&kb_category=' + c.data.breadCrumb[i].values.kb_category;
}
} else {
c.data.breadCrumb[i].url = '?id=kb_search&kb_knowledge_base=' + c.data.breadCrumb[i].values.kb_knowledge_base + '&kb_category=' + c.data.breadCrumb[i].values.kb_category;
}
}
}
}
}
if (c.data.page_title) {
// setting default page title for supporting km seo
$window.document.title = c.data.page_title;
if (c.data.article_sys_id)
appendKBSysIdToURL();
}
function appendKBSysIdToURL() {
if ($window) {
if (c.data.params.sys_kb_id) // return if url already contains sys_kb_id
return;
// for supporting km seo, adding kb_sys_id to the url when kb is viewed using sysparm_article (kb number)
$timeout(function() {
$location.search('sys_kb_id',scope.data.article_sys_id);
$location.search('spa','1');
});
}
}
c.showVersions = false;
c.toggleVersions = function(){
c.showVersions = !c.showVersions;
$('#kbVersionInfo').slideToggle("fast");
};
c.selectLanguage = function(ind){
$window.location.replace('?id='+c.data.params.sysparm_article_view_page_id+'&sys_kb_id=' + c.data.langList[ind].sys_id);
};
c.showActionMenu = function(){
if(c.showMenu){
return true;
}
else{
if(c.data.properties && c.data.properties.isSubscriptionEnabled && $window.innerWidth < 992)
return true;
else
return false;
}
}
c.toggleSection = function(field) {
field.collapsed = !field.collapsed;
$('#'+field.column).slideToggle("fast");
};
c.handleSubscribeButtonFocus = function(){
if($scope.data.isSubscribed){
$scope.data.subscribeLabel = $rootScope.messages.UNSUBSCRIBE;
$scope.data.toggleSubscribed = !$scope.data.toggleSubscribed;
}
};
c.handleSubscribeButtonBlur = function(){
if($scope.data.isSubscribed){
$scope.data.subscribeLabel = $rootScope.messages.SUBSCRIBED;
$scope.data.toggleSubscribed = !$scope.data.toggleSubscribed;
}
}
c.closeUnsubscribeModal = function(){
$("#unSubscribeModal").modal('hide');
};
c.handleSubscription = function(confirmation){
c.data.actionName = null;
if(!$scope.data.isSubscribed){
c.data.actionName = 'subscribe';
c.data.articleSysId = $scope.data.article_sys_id;
c.data.articleNum = $scope.data.number;
}
else
{
if($scope.data.isArticleSubscribed && !$scope.data.isArticleSubscribedAtKB){
c.data.actionName = "unsubscribe";
c.data.articleSysId = $scope.data.article_sys_id;
c.data.articleNum = $scope.data.number;
c.data.unsubscribeKB = false;
}
else if(!confirmation){
//$("#unSubscribeModal").modal();
var unsubscribeMessage = "<p>" + c.data.messages.UNSUBSCRIBE_CONTENT + "</p><p><b>" + c.data.messages.UNSUBSCRIBE_CONFIRMATION + "</b></p>";
spModal.open(
{
title: c.data.messages.UNSUBSCRIBE,
buttons : [{label : c.data.messages.NO, cancel : true}, {label: c.data.messages.YES, primary : true}],
message : unsubscribeMessage
}).then(function(){
c.handleSubscription('Y');
}, function(){
c.closeUnsubscribeModal();
});
return;
}
else if(confirmation === 'Y'){
c.data.actionName = "unsubscribe";
c.closeUnsubscribeModal();
c.data.articleSysId = $scope.data.article_sys_id;
c.data.kbSysId = $scope.data.kbSysId;
c.data.articleNum = $scope.data.number;
c.data.kbName = $scope.data.kbName;
c.data.unsubscribeKB = true;
}
}
c.server.get({action : c.data.actionName, kbSysId : c.data.kbSysId, kbName : c.data.kbName, articleSysId : c.data.articleSysId, articleNum : c.data.articleNum, unsubscribeKB : c.data.unsubscribeKB, isArticleSubscribed: c.data.isArticleSubscribed, isKBSubscribed : c.data.isArticleSubscribedAtKB}).then(function(resp){
if(c.data.actionName == 'subscribe'){
$scope.data.isArticleSubscribed = true;
$scope.data.isSubscribed = true;
$scope.data.subscribeLabel = $rootScope.messages.SUBSCRIBED;
}
else{
$scope.data.isArticleSubscribed = false;
$scope.data.isSubscribed = false;
$scope.data.isArticleSubscribedAtKB = false;
$scope.data.subscribeLabel = $rootScope.messages.SUBSCRIBE;
}
c.showUIMessage('info', resp.data.responseMessage);
});
};
c.submitFlagComments = function(){
if(!c.data.comment){
c.flagMessage = "${Please provide a comment to flag the article}";
$("#flagComment").focus();
return false;
}
else{
c.server.get({action : 'saveFlagComment', article_sys_id : c.data.article_sys_id, comment : c.data.comment}).then(function(resp){
if(resp.data.feedbackSuccess){
c.showUIMessage('info', c.data.messages.ARTICLE_FLAGGED);
c.clearComment();
}
else {
c.showUIMessage('error', c.data.messages.RATE_LIMIT_REACHED);
c.clearComment();
}
});
}
};
c.copyPermalink = function(){
var v = document.createElement('textarea');
var permalink = document.location.origin + document.location.pathname + '?id='+c.data.params.sysparm_article_view_page_id+'&sysparm_article=' + $scope.data.number;
v.innerHTML = permalink;
v.className = "sr-only";
document.body.appendChild(v);
v.select();
var result = true;
try {
result = document.execCommand('copy');
}
catch(err){
result = false;
}
finally{
document.body.removeChild(v);
}
if(result === true){
c.showUIMessage('info', c.data.messages.PERMALINK_COPIED);
}
else{
$window.prompt("${Because of a browser limitation the URL can not be placed directly in the clipboard. Please use Ctrl-C to copy the data and escape to dismiss this dialog}", permalink);
}
};
var modal = null;
c.launchFlagModal = function(){
c.clearComment();
modal = $uibModal.open(
{
title : c.data.messages.FLAG_THIS_ARTICLE,
scope : $scope,
templateUrl : 'kb-flag-article-modal'
});
}
var taskPopUp = $rootScope.$on("sp.kb.feedback.openTaskPopup",function(event,data){
c.ftask = {};
if(data){
c.launchFeedbackTaskModal();
c.ftask.feedback_action = data.feedback_data.action;
c.ftask.feedback_rating = data.feedback_data.rating
c.ftask.action= "createFeedbackTask";
}
});
c.launchFeedbackTaskModal = function(){
c.clearFeedbackTask();
modal = $uibModal.open({
title : c.data.messages.FEEDBACK,
windowClass : 'app-modal-window',
scope : $scope,
templateUrl : 'kb-feedback-task-modal'
});
modal.closed.then(function(){
if(!c.submitted){
c.data.reason = "4";
c.data.details ="";
}
if(c.ftask.action == "createFeedbackTaskWithFlagComment" && !c.submitted)
return;
modal = null;
c.server.get({action : c.ftask.action,
article_sys_id : c.data.article_sys_id,
reason : c.data.reason,
details : c.data.details,
feedback_action: c.ftask.feedback_action,
rating : c.ftask.feedback_rating
}).then(function(resp){
if(resp.data.responseMessage){
if(resp.data.feedbackSuccess){
c.showUIMessage('info', resp.data.responseMessage);
}else{
c.showUIMessage('error', resp.data.responseMessage);
}
}
});
c.clearFeedbackTask();
});
}
c.clearComment = function(){
$scope.data.comment = '';
c.flagMessage = '';
c.closePopup();
}
c.showUIMessage = function(type,msg){
if(cabrillo.isNative()){
cabrillo.message.showMessage(type != 'error' ? cabrillo.message.SUCCESS_MESSAGE_STYLE : cabrillo.message.ERROR_MESSAGE_STYLE, msg);
}else{
if(type == 'error')
spUtil.addErrorMessage(msg);
else
spUtil.addInfoMessage(msg);
}
}
c.closePopup = function(){
if(modal){
modal.dismiss();
}
}
c.clearFeedbackTask = function(){
c.submitted = false;
c.data.reason = '4';
c.data.details = '';
c.flagMessage = '';
c.ftask = {};
c.closePopup();
}
c.submitFeedbackTask = function(){
if(!c.data.reason){
c.flagMessage = "${Please provide the mandatory details}";
$("#detailsComment").focus();
return false;
}
else{
c.submitted = true;
c.closePopup();
}
}
c.imgModalClose = function(){
c.imageInstance.close();
}
$scope.$on("$destroy", taskPopUp);
}
Server Script:
data.tsQueryId = $sp.getParameter("sysparm_tsqueryId") || "";
var isMESP = (options.is_mobile && options.is_mobile == "true") || ($sp.getParameter("id") == "me_kb_view") || false;
options.kb_rating_style = options.kb_rating_style ? options.kb_rating_style == "true" : false;
if(!input){
var kbViewModel = new global.KBViewModel();
var kbPortal = new sn_km_portal.KBPortalService();
populateParameters();
kbViewModel.getInfoForSP(data.params);
var isValidRecord = kbViewModel.isValid;
if (options.redirect_latest == 'true' && isValidRecord && kbViewModel.knowledgeRecord && kbViewModel.versioningInfo.newVersionAvailable) {
data.params.sys_kb_id = kbViewModel.versioningInfo.history[0].sysId;
data.redirect = data.params.sys_kb_id;
kbViewModel = new global.KBViewModel();
kbViewModel.getInfoForSP(data.params);
isValidRecord = kbViewModel.isValid;
}
data.knowledgeExists = kbViewModel.knowledgeExists;
data.kb_knowledge_page = $sp.getDisplayValue("kb_knowledge_page") || "kb_view2";
data.messages = {};
data.langList = [];
var tsQueryId = $sp.getParameter("sysparm_tsqueryId");
var rank = $sp.getParameter("sysparm_rank");
if(tsQueryId && rank && tsQueryId != ""){
kbViewModel.updateTsQueryKbWithRank(tsQueryId,rank);
}
options.knowledge_bases = options.knowledge_bases || String(kbPortal.getServicePortalKnowledgeBases($sp.getPortalRecord().url_suffix)) || "";
var knowledgeRecord = kbViewModel.knowledgeRecord;
if(options.knowledge_bases && knowledgeRecord && knowledgeRecord.kb_knowledge_base ){
if(options.knowledge_bases.indexOf(knowledgeRecord.kb_knowledge_base) == -1)
if(!kbPortal.isMemberOfAOG(knowledgeRecord))
isValidRecord = false;
}
if (isValidRecord && knowledgeRecord) {
data.isKBAdmin = kbViewModel.isAdminUser(knowledgeRecord);
data.isKBOwner = (gs.getUserID() == knowledgeRecord.kb_knowledge_base.owner);
populateDataFromKBViewModel();
// fetching default page title to support km seo
data.page_title = getPageTitle();
populateMessages();
populateCommonProperties();
if(!isMESP){
populateBreadCrumbs();
populateVersionInfo();
}
handleViewCountIncrement();
if(!isMESP)
populateContributorInfo();
if(data.articleType === 'wiki'){
initGlideWiki();
}
data.sys_updated_on = "";
if (kbViewModel.publishedRecord) {
published = kbViewModel.publishedRecord.published;
data.sys_updated_on = kbViewModel.publishedRecord.sys_updated_on + "";
}
data.shortDesc = knowledgeRecord.short_description + "";
populateSystemProperties();
getFeedbackReasonValues();
if(data.properties.showAffectedProducts === 'true' || data.properties.showAffectedProducts === true){
populateAffectedProducts();
}
if(data.properties.showAttachedTasks === true || data.properties.showAttachedTasks === 'true'){
populateAttachedTasks();
}
$sp.logStat('KB Article View', "kb_knowledge", knowledgeRecord.sys_id, knowledgeRecord.short_description);
}
else{
data.messages.INSUFFICIENT_PREVILEGES = gs.getMessage("You do not have sufficient privileges to access this knowledge item");
data.messages.RECORD_NOT_FOUND = gs.getMessage("Knowledge record not found");
}
}
if(input){
if(input.action == 'insertincident'){
console.log(input.article_sys_id);
var gr1 = new GlideRecord('kb_knowledge');
gr1.addQuery('sys_id',input.article_sys_id);
gr1.query();
if(gr1.next()){
var gr = new GlideRecord('incident');
gr.initialize();
gr.parent_incident = gr1.u_parent_incident;
gr.short_description = gr1.u_parent_incident.short_description;
gr.description= gr1.u_parent_incident.description;
gr.insert();
}
console.log(gr1.sys_id);
}
if(input.action === 'saveFlagComment'){
var kbPortal = new KBPortalService();
var params = {};
params.sysparm_id = input.article_sys_id;
params.feedback = input.comment;
params.sysparm_flag = "true";
params.ts_queryId = data.tsQueryId;
var response = kbPortal.kbWriteCommentWithParams(params);
var resp = new global.JSON().decode(response);
data.feedbackSuccess=resp.success;
}
if(input.action == 'createFeedbackTask'){
var response;
var kbPortal = new KBPortalService();
var successMessage = options.feedback_message ? options.feedback_message : gs.getMessage('Thank you, we appreciate your feedback');
var max_daily_comments = gs.getProperty("glide.knowman.max_comments_per_user_daily",'0');
var failureMessage = parseInt(max_daily_comments)>0? gs.getMessage("You have reached the daily limit for comments posted by a user."):gs.getMessage('Failed to save feedback');
var params = buildParams();
params.reason = input.reason;
params.comments = input.details;
if(input.feedback_action == "useful_no"){
params.useful = "no";
response = kbPortal.saveUsefulWithParams(params) + '';
}else if(input.feedback_action == "rating"){
params.rating = input.rating;
response = kbPortal.saveStarRatingWithParams(params) + '';
}
data.responseMessage = response.includes('true') ? successMessage : failureMessage;
var resp = new global.JSON().decode(response);
data.feedbackSuccess = resp.success;
}
if(input.action === 'subscribe'){
var subResult = subscribeObject('Article', input.articleSysId, gs.getUserID());
if(subResult){
data.responseMessage = gs.getMessage("You are now subscribed to {0}. You will be notified of any new activity according to your notification settings.", input.articleNum);
}
}
if(input.action === 'unsubscribe'){
var subResult = false;
if(input.unsubscribeKB){
subResult = unsubscribeObject('KB', input.articleSysId, input.kbSysId);
if(subResult === 'Article'){
data.responseMessage = gs.getMessage("Your subscriptions to {0} Knowledge Base and {1} have been removed.", [input.kbName, input.articleNum]);
}
else{
data.responseMessage = gs.getMessage("Your subscription to {0} Knowledge Base has been removed.", input.kbName);
}
}
else{
subResult = unsubscribeObject('Article', input.articleSysId, null);
if(subResult){
data.responseMessage = gs.getMessage("Your subscription to {0} has been removed.", input.articleNum);
}
}
}
if(input.action == 'kbAttachArticle'){
var kAjax = new global.KnowledgeAjax();
data.articleContent = kAjax.kbAttachArticleImpl(input.value);
}
}
function buildParams(){
var params = {};
params.article = input.article_sys_id;
params.sysparm_id = input.article_sys_id;
params.ts_queryId = data.tsQueryId;
params.session_id = gs.getSessionID();
params.user = gs.getUserID();
return params;
}
function subscribeObject(type, sysId, userId){
var kAjax = new global.KnowledgeAjax();
return kAjax.subscribeKbArticle(sysId, "7d8f537453003200fa9bd7b08cc5872c");
}
function unsubscribeObject(type, articleSysId, kbSysId){
var kAjax = new global.KnowledgeAjax();
if(type === 'Article'){
return kAjax.unsubscribeKbArticle(articleSysId);
}
else{
return kAjax.unsubscribeKB(articleSysId, kbSysId);
}
}
function populateMessages(){
data.messages.REASON = gs.getMessage("Reason");
data.messages.DETAILS = gs.getMessage("Details");
data.messages.FEEDBACK = gs.getMessage("Feedback");
data.messages.THANKYOU_FEEDBACK = gs.getMessage("Thank you for the feedback");
data.messages.ADDTIONAL_DETAILS = gs.getMessage("Please provide additional details");
data.messages.NO_THANKS = gs.getMessage("No thanks");
data.messages.ADD_DETAIL = gs.getMessage("Add a Detail Comment");
data.messages.ARTICLE_FLAGGED = gs.getMessage("Article has been flagged");
data.messages.FLAG_THIS_ARTICLE = gs.getMessage("Flag this article");
data.messages.ADD_COMMENT = gs.getMessage("Add a comment (mandatory)");
data.messages.NOT_RETIRED = gs.getMessage("Article not retired");
data.messages.NOT_PUBLISHED = gs.getMessage("Article not published");
data.messages.NOT_SAVED = gs.getMessage("Article not saved");
data.messages.SAVED = gs.getMessage("Article saved");
data.messages.HOME = gs.getMessage('Home');
data.messages.DISCARDED = gs.getMessage("Article changes discarded");
data.messages.SUBMITTED = gs.getMessage("Your article has been submitted");
data.messages.PREVIEW = gs.getMessage(" Preview ");
data.messages.PREVIEW_HINT = gs.getMessage("Preview changes");
data.messages.DELETE = gs.getMessage("Delete");
data.messages.CONFIRM_DELETE = gs.getMessage("Confirm deletion of this article?");
data.messages.TITLE_CANCEL = gs.getMessage("Cancel changes");
data.messages.MESSAGE_CANCEL = gs.getMessage("Discard all changes?");
data.messages.TITLE_RETIRE = gs.getMessage("Retire");
data.messages.MESSAGE_RETIRE = gs.getMessage("Retire this article?");
// Status messages for the message bar.
data.messages.DRAFT_MSG = gs.getMessage("This knowledge item has been created");
data.messages.REVIEW_MSG = gs.getMessage("This knowledge item has been published");
data.messages.PUBLISHED_MSG = gs.getMessage("This knowledge item has been published");
data.messages.PEND_RETIRE_MSG = gs.getMessage("This knowledge item has been retired");
data.messages.RETIRED_MSG = gs.getMessage("This knowledge item has been retired");
data.messages.DELETE_FAIL_MSG = gs.getMessage("This article could not be deleted");
data.messages.TXT_PLACEHOLDER = gs.getMessage("Add content");
data.messages.LATEST_VERSION = gs.getMessage("Latest version");
data.messages.SUBSCRIBE = gs.getMessage("Subscribe");
data.messages.UNSUBSCRIBE = gs.getMessage("Unsubscribe");
data.messages.COPY_PERMALINK = gs.getMessage("Copy Permalink");
data.messages.SUBMIT = gs.getMessage('Submit');
data.messages.COMMENTS = gs.getMessage('Comments');
data.messages.AFFECTED_PRODUCTS = gs.getMessage('Affected Products');
data.messages.OUTDATED = gs.getMessage('Outdated');
data.messages.KNOWLEDGE_BASE = gs.getMessage('Knowledge Base');
data.messages.KNOWLEDGE = gs.getMessage('Knowledge');
data.messages.ATTACHED_INCIDENTS = gs.getMessage("Most recent tasks");
data.messages.THANK_YOU = gs.getMessage("Thank you");
data.messages.RATE_LIMIT_REACHED = gs.getMessage("You have reached the daily limit for comments posted by a user.");
data.messages.NO_ATTACHMENTS = gs.getMessage("No attachments found");
data.messages.NO_INCIDENTS = gs.getMessage("No tasks found");
data.messages.NO_PRODUCTS = gs.getMessage("No affected products found");
data.messages.EDIT = gs.getMessage("Edit");
data.messages.ATTACHMENTS = gs.getMessage('Attachments');
data.messages.HELPFUL = gs.getMessage('Helpful?');
data.messages.CREATE_INCIDENT = gs.getMessage("Create Incident");
data.messages.FLAG_ARTICLE = gs.getMessage("Flag Article");
data.messages.PERMALINK_COPIED = gs.getMessage("Permalink copied successfully");
data.messages.SUBSCRIPTION_CONFIRMATION = gs.getMessage("You are now subscribed to {0}. You will be notified of any new activity according to your notification settings", data.number);
data.messages.SUBSCRIBED = gs.getMessage("Subscribed");
data.messages.YES = gs.getMessage("Yes");
data.messages.NO = gs.getMessage("No");
data.messages.UNSUBSCRIBE_CONTENT = gs.getMessage("In order to unsubsrcibe from this article, you will need to unsubscribe from the parent knowledge base: {0}. ", data.kbName);
data.messages.UNSUBSCRIBE_CONFIRMATION = gs.getMessage("Would you like to unsubscribe from {0}", data.kbName);
data.messages.CANCEL = gs.getMessage("Cancel");
data.messages.ACTION_MENU = gs.getMessage("Action Menu. Please click for available actions on the article");
data.messages.CLOSE = gs.getMessage("Close");
data.messages.JUST_NOW = gs.getMessage("just now");
data.messages.ARTICLE_RATING = gs.getMessage("Average article rating - {0} stars", data.avgRating);
data.messages.EXTERNAL_CONTENT = gs.getMessage(gs.getProperty("sn_km_intg.glide.knowman.external.ui_label_for_external_content", "External Content"));
if(data.params.sysparm_kb_search_table){
var label = new GlideRecord(data.params.sysparm_kb_search_table).getLabel();
if(label)
data.messages.ATTACH_TO_TASK_LABEL = gs.getMessage("Attach to {0}", label);
else
data.messages.ATTACH_TO_TASK_LABEL = gs.getMessage("Attach to record");
}
}
function populateParameters(){
data.params = {};
data.params.sysparm_article = $sp.getParameter('sysparm_article');
data.params.sysparm_language = $sp.getParameter('sysparm_language');
data.params.sys_kb_id = $sp.getParameter('sys_kb_id') || $sp.getParameter('sys_id');
data.params.sysparm_no_update = $sp.getParameter('sysparm_no_update');
data.params.sysparm_no_suggest = $sp.getParameter('sysparm_no_suggest');
data.params.sysparm_no_info = $sp.getParameter('sysparm_no_info');
data.params.sysparm_no_create_incident = $sp.getParameter('sysparm_no_create_incident');
data.params.sysparm_ts_queryId = $sp.getParameter('sysparm_tsqueryId');
data.params.sysparm_article_view_page_id = $sp.getParameter('id');
data.params.sysparm_kb_search_table = $sp.getParameter('sysparm_kb_search_table')||'';
}
function populateSystemProperties(){
data.properties = {};
data.properties.showStarRating = getProperty("glide.knowman.show_star_rating", "show_star_rating", true, true);
data.properties.showRatingOptions = getProperty("glide.knowman.show_rating_options", "show_rating_options", true, true);
data.properties.showYesNoRatings = getProperty("glide.knowman.show_yn_rating", "show_yn_rating", true, true);
//data.properties.showFlagArticle = getProperty("glide.knowman.show_flag", "show_flag", true, true);
//data.properties.showFlagArticle = data.properties.showFlagArticle && !params.sysparm_no_suggest && !knowledgeRecord.disable_suggesting;
data.properties.showUserComments = getProperty("glide.knowman.show_user_feedback", "show_user_feedback", 'onload');
data.properties.showAffectedProducts = gs.getProperty('glide.knowman.affected_products.display','true');
data.properties.showAttachedTasks = gs.getProperty('glide.knowman.recent_tasks.display','true');
data.properties.attachFields = gs.getProperty('glide.knowman.attach.fields');
if(data.properties.showAttachedTasks === 'true'){
data.properties.showAttachedTasks = gs.hasRole('itil') || gs.hasRole('knowledge');
}
data.properties.showCreateIncident = !kbViewModel.isInPopup && !data.params.sysparm_no_create_incident;
data.properties.createIncidentURL = getProperty('glide.knowman.create_incident_link', 'create_incident_link', '', false);
data.properties.isSubscriptionEnabled = kbViewModel.isSubscriptionEnabled;
data.properties.isEditable = kbViewModel.isEditable;
data.properties.showFeedBack = kbViewModel.showKBFeedback;
data.properties.showKBRatingOptions = kbViewModel.showKBRatingOptions;
data.properties.showKBHelpfullRating = kbViewModel.showKBHelpfullRating;
data.properties.showKBStarRating = kbViewModel.showKBStarRating;
data.properties.showKBCreateIncident = kbViewModel.showKBCreateIncident;// && !kbViewModel.isInPopup && !params.sysparm_no_create_incident;
data.properties.showKBFlagArticle = kbViewModel.showKBFlagArticle && !data.params.sysparm_no_suggest && !knowledgeRecord.disable_suggesting;
data.properties.showKBUpdateAction = kbViewModel.showKBUpdateAction;
data.properties.readOnlyPage = gs.getProperty('glide.knowman.contextual_search.show_read_only_article','false');
}
function getProperty(propertyName, optionName, defaultValue, checkRoles){
var optionVal = options[optionName];
if(!optionVal || optionVal === 'use_system' || !(optionVal === 'yes' || optionVal === 'no') ){
var propValue = gs.getProperty(propertyName, defaultValue);
if(propValue && checkRoles){
var roles = gs.getProperty(propertyName + '.roles');
if (roles != null && roles != ''){
propValue = gs.hasRole(roles);
}
}
return propValue;
}
else {
return optionVal === 'yes' ? true : false;
}
}
function populateCommonProperties(){
data.isMobileView = ($sp.getParameter('sysparm_device') != "" && $sp.getParameter('sysparm_device') == "mobile");
data.isKBLanguagesNewUI = GlidePluginManager.isActive('com.glideapp.knowledge.i18n2');
if(data.isKBLanguagesNewUI){
data.langList = kbViewModel.getLanguagesToDisplay(knowledgeRecord);
}
}
function populateDataFromKBViewModel(){
data.isValid = true;
data.isLoggedInUser = gs.getSession().isLoggedIn();
data.canContributeToKnowledge = kbViewModel.canContributeToKnowledgeBase; //canContributeHelper.canContribute(kbViewModel.knowledgeRecord);
data.article_sys_id = knowledgeRecord.sys_id + '';
data.authorTitle = kbViewModel.authorTitle || kbViewModel.getAuthorInfo("author.title");
data.kbContentData = kbViewModel.getArticleViewData();
data.avgRating = Math.round(knowledgeRecord.rating);
data.number = knowledgeRecord.number + '';
data.parentIncident = knowledgeRecord.u_parent_incident;
if(data.parentIncident==''){
data.status = false;
}
else{
console.log(data.parentIncident.number);
var gr2 = new GlideRecord('incident');
gr2.addQuery('parent_incident',data.parentIncident);
gr2.addQuery('sys_created_by',gs.getUserName());
gr2.query();
console.log(gr2.getRowCount());
if(gr2.getRowCount() > 0){
data.status = false;
}
else{
data.status = true;
}
}
data.articleType = knowledgeRecord.article_type + '';
data.permalink = kbViewModel.permalink;
data.category = knowledgeRecord.category;
data.attachments = kbViewModel.attachments;
data.shortDesc = knowledgeRecord.short_description + "";
data.viewCount = knowledgeRecord.getDisplayValue('sys_view_count');
data.displayAttachments = knowledgeRecord.display_attachments + '';
data.tableName = knowledgeRecord.sys_class_name + '';
data.disableSuggesting = knowledgeRecord.disable_suggesting;
data.revisionString = kbViewModel.revisionString;
data.articleTemplate = kbViewModel.articleTemplateName;
data.isSubscriptionEnabled = kbViewModel.isSubscriptionEnabled;
data.helpfulContent = kbViewModel.helpfulText;
if(data.isSubscriptionEnabled === true && !isMESP){
data.isArticleSubscribed = (new global.ActivitySubscriptionContext().getSubscriptionService().isSubscribed(knowledgeRecord.sys_id).subscriptionId) ? true : false;//kbViewModel.isArticleSubscribed;
data.isArticleSubscribedAtKB = (new global.ActivitySubscriptionContext().getSubscriptionService().isSubscribed(knowledgeRecord.kb_knowledge_base).subscriptionId) ? true : false;//kbViewModel.isArticleSubsrcibedAtKB;
}
else{
data.isArticleSubscribed = false;
data.isArticleSubscribedAtKB = false;
}
data.kbSysId = knowledgeRecord.kb_knowledge_base.sys_id + '';
data.kbName = knowledgeRecord.kb_knowledge_base.getDisplayValue() + '';
data.externalArticle = kbViewModel.externalArticle;
data.hasComments = !kbViewModel.feedbackEntryInitialDisplay;
data.isTaskTable = data.params.sysparm_kb_search_table ? kbViewModel.isTaskTable(data.params.sysparm_kb_search_table) : false;
}
function populateBreadCrumbs(){
var breadCrumb = kbViewModel.getBreadcrumb();
data.breadCrumb = [];
data.breadCrumb.push({label: knowledgeRecord.kb_knowledge_base.title + ' (' + data.messages.KNOWLEDGE_BASE + ')', type: 'kb_knowledge_base', values: {kb_knowledge_base: knowledgeRecord.kb_knowledge_base.sys_id + ''}});
var ctg = '';
for(var i = 0; i < breadCrumb.length; i++){
ctg += breadCrumb[i].name;
if(i != breadCrumb.length - 1){
ctg += ' - ';
}
}
if(ctg !== '' && breadCrumb && breadCrumb.length > 0){
data.breadCrumb.push({label: ctg + '', type: 'kb_category', values: {kb_knowledge_base: breadCrumb[breadCrumb.length - 1].knowledge_base + '', kb_category: breadCrumb[breadCrumb.length - 1].value + ''}});
}
}
function handleViewCountIncrement(){
knowledgeRecord.incrementViewCount();
var viewCountGR = new GlideRecord('kb_knowledge');
if(viewCountGR.get(knowledgeRecord.sys_id))
data.viewCount = viewCountGR.getValue('sys_view_count');
}
function initGlideWiki(){
try{
data.kbWiki = kbViewModel.getWikiContent();
}
catch(e){
data.kbWiki = '';
}
}
function populateAttachedTasks(){
data.attachedIncidents = [];
data.attachedIncidents = kbViewModel.getAttachedTasks();
}
function populateAffectedProducts(){
data.affectedProducts = [];
data.affectedProducts = kbViewModel.getAffectedProducts();
}
function populateVersionInfo(){
data.isVersioningEnabled = kbViewModel.versioningInfo.isEnabled;
data.versionList = kbViewModel.versioningInfo.history;
data.version = knowledgeRecord.getDisplayValue('version');
data.isLatestVersion = !(kbViewModel.versioningInfo.newVersionAvailable === true);
data.workflowState = (knowledgeRecord.workflow_state != 'published') ? ('(' + knowledgeRecord.workflow_state.getDisplayValue() + ')') : '';
data.versionInfo = kbViewModel.versioningInfo.versionDisplay;//((kbViewModel.versioningInfo.newVersionAvailable === true) ? 'v' + data.version : data.messages.LATEST_VERSION);
data.versionInfoLabel = kbViewModel.versioningInfo.versionDisplayLabel;
data.showHistory = kbViewModel.versioningInfo.showHistory;
data.hideFeedbackOptions = kbViewModel.hideFeedbackOptions;
data.versionWarningMessage = kbViewModel.versioningInfo.warningMessage;
if(data.versionWarningMessage){
data.versionWarningMessage = data.versionWarningMessage.replace('kb_view.do?', '?id='+data.params.sysparm_article_view_page_id+'&');
}
}
function populateContributorInfo(){
if(!GlidePluginManager.isActive('com.sn_communities')) return;
if(sn_communities.CommunityKnowledgeHarvest){
var h = new sn_communities.CommunityKnowledgeHarvest();
var res = h.getHarvestedContentInfo(''+knowledgeRecord.sys_id);
if(res && res.status == 200){
data.hInfo = res.data;
if(data.hInfo){
var message = gs.getMessage("Created from the Community by {0}");
var contributor = data.hInfo.contributor;
var profile = gs.getMessage('Community user');
if(contributor){
profile = contributor.name.length > 0 ? contributor.name : profile;
if(contributor.userId)
profile = '<a href="?id=community_user_profile&user='+contributor.userId+'" target="_blank_cm1" >'+profile+'</a>';
}
message = message.replace('{0}', profile);
data.hInfo.profileMessage = message;
}
}
}
}
function getFeedbackReasonValues(){
data.feedback_reasons=[];
var kbFbTask = new global.KBFeedbackTask();
var response = kbFbTask.getReasonValues();
if(response){
data.feedback_reasons = new global.JSON().decode(response);
}
}
function getPageTitle() {
var title = gs.getMessage("Knowledge Article View");
if (!gs.nil(data.article_sys_id)) // kb record found
title = knowledgeRecord.kb_knowledge_base.getDisplayValue() + " - " + data.shortDesc; // kb name - kb short_desc
else if (!gs.nil(data.params.sysparm_article_view_page_id)) {
// kb record NOT found - fetching the kb_article_view portal page title
var kbPage = new GlideRecord('sp_page');
kbPage.addQuery("id",data.params.sysparm_article_view_page_id+"");
kbPage.query();
if(kbPage.next())
title = kbPage.getValue('title');
}
return title;
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-23-2020 10:06 PM
Hi Brad I tried to use ng-hide but it isn't working
How can we use ng-hide on button click?
HTML :
<button ng-if="c.data.parentIncident" ng-hide = "IsVisible" class="btn btn-default" name="createincident" ng-model="createincident" ng-click="c.createIncident()">
I have same issue
</button>
Client Script:
var c = this;
c.IsVisible = false;
c.createIncident= function(){
c.IsVisible = c.IsVisible ? false : true;
alert("Work");
c.server.get({action : 'insertincident',article_sys_id : c.data.article_sys_id})
};

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-24-2020 06:22 AM
I don't believe you're calling the property correctly in ng-hide. Here's a quick example I put together that successfully hides the button when it clicked. You should be able to use something similar in your own code. I'm using ngShow but you can really use either.
HTML
<div>
<button class="form-control" ng-show="c.isVisible" ng-click="c.clickButton();">
Click me
</button>
</div>
Client Script:
function() {
/* widget controller */
var c = this;
c.isVisible = true;
c.clickButton = function() {
c.isVisible = false;
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-24-2020 09:57 PM
Thanks for your reply.
I have already completed my task.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎06-26-2020 10:05 PM
Got the solution:
HTML:
<div class="kb-article-wrapper">
<div ng-if="data.versionWarningMessage && c.options.show_version_info != 'false'" class="alert alert-info alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<div ng-bind-html="data.versionWarningMessage">
</div>
</div>
<div ng-if="::data.isValid" ng-class="c.isMobile ? 'kb-mobile' : 'panel panel-default kb-desktop'">
<div class="kb-panel-heading" ng-class="{'panel-heading' : !c.isMobile}">
<span ng-class="{'panel-title' : !c.isMobile}">
<div class="row">
<span class="col-md-5 kb-panel-title-header">
<div class="kb-number-info">
<span>{{data.number}}</span>
<span ng-if="!c.isMobile && data.showHistory && c.options.show_version_info != 'false'"> - <a ng-click="c.toggleVersions()" href="javascript:void(4)" aria-label="{{data.versionInfoLabel}}"> {{data.versionInfo}}</a> </span>
<span ng-if="!c.isMobile && data.workflowState">{{data.workflowState}}</span>
</div>
</span>
<div ng-if="!c.isMobile && !$root.hideFeedbackOptions && c.options.hide_all_actions != 'true'" class="col-md-7 kb-end-buttons">
<div class="dropdown kb-end-buttons">
<span class="hidden-sm hidden-xs" ng-if="!data.externalArticle">
<a tabindex="0" ng-mouseover="c.handleSubscribeButtonFocus()"
ng-if="data.properties.isSubscriptionEnabled"
ng-mouseleave="c.handleSubscribeButtonBlur()"
ng-focus="c.handleSubscribeButtonFocus()"
ng-blur="c.handleSubscribeButtonBlur()"
role="button"
class="btn btn-default kb-subscribe" ng-click="c.handleSubscription()" href="javascript:void(5)">
<span class="kb-sub-icon" aria-label="{{data.subscribeLabel}}">
{{data.subscribeLabel}}
</span>
</a>
</span>
<button ng-if="c.data.status" name="createincident" ng-click="c.createIncident()">
I have same issue
</button>
<button ng-if="c.showAttachArticle()" class="btn btn-default" type="button" ng-click="c.attachToTask()" aria-label="{{::data.messages.ATTACH_TO_TASK_LABEL}}">{{::data.messages.ATTACH_TO_TASK_LABEL}}</button>
<button ng-if="c.showActionMenu() && !$root.readOnly" class="btn btn-default dropdown-toggle kb-dropdown-button" type="button" data-toggle="dropdown" aria-label="{{::data.messages.ACTION_MENU}}">
<span class="glyphicon glyphicon-option-horizontal kb-action-menu-padding"></span>
</button>
<ul id="kbActionMenuList" class="dropdown-menu dropdown-menu-right">
<li class="kb-menu-entry hidden-md hidden-lg visible-sm visible-xs" ng-if="data.properties.isSubscriptionEnabled && !data.externalArticle">
<a ng-mouseover="c.handleSubscribeButtonFocus()"
ng-if="data.properties.isSubscriptionEnabled && c.options.hide_subscription != 'true'"
ng-mouseleave="c.handleSubscribeButtonBlur()"
ng-focus="c.handleSubscribeButtonFocus()"
ng-blur="c.handleSubscribeButtonBlur()"
href="javascript:void(6)"
ng-click="c.handleSubscription()">
<span class="kb-sub-icon" aria-label="{{data.subscribeLabel}}">
{{data.subscribeLabel}}
</span>
</a>
</li>
<li class="kb-menu-entry" ng-if="c.showFlagArticle"><a href="javascript:void(1)" data-toggle="modal" ng-click="c.launchFlagModal()">{{data.messages.FLAG_ARTICLE}}</a></li>
<li class="kb-menu-entry" ng-if="c.showCreateIncident"><a target="_blank" href="{{c.createIncidentURL}}">{{c.createIncidentLabel}}</a></li>
<li class="kb-menu-entry" ng-if="data.properties.isEditable" ><a target="_blank" href="kb_knowledge.do?sys_id={{data.article_sys_id}}&sysparm_stack={{c.stackUrl}}">{{data.messages.EDIT}}</a></li>
</ul>
</div>
<!-- Flag article modal -->
</div>
</div>
</span>
</div>
<div class="kb-wrapper" ng-class="c.isMobile ? 'kb-mobile' : 'panel-body kb-desktop'">
<div id="kbVersionInfo" class="kb-version-info" style="display:none" ng-if="!c.isMobile && data.showHistory && c.options.hide_version_info != 'true'" class="kb-version-info">
<div class="kb-version" ng-repeat="version in data.versionList">
<span ng-if="!version.isCurrent"><a href="?id=kb_article_view&sys_kb_id={{version.sysId}}" aria-label="{{version.versionLabel}}">{{version.versionNumber}}</a> - {{version.versionText}}</span>
<span ng-if="version.isCurrent"><b>{{version.versionNumber}} - {{version.versionText}}</b></span>
</div>
</div>
<h2 class="widget-header kb-title-header">{{::data.shortDesc}}</h2>
<div class="kb-language-block pad-right text-nowrap" ng-if="data.langList.length > 1" ng-cloak>
<div class="kb-language">
<div class="dropdown">
<a href="javascript:void(0);" class="dropdown-toggle" aria-label="${Click to view the article in other available languages}" aria-haspopup="true" data-toggle="dropdown">
<span class="lang-icon"><i class="fa fa-globe" aria-hidden="true"></i></span>
<span class="lang-data" ng-class="{'hidden-xs':!c.isMobile}">${{{c.selectedLanguage.label}}}</span>
</a>
<ul class="dropdown-menu dd-right-menu" role="menu">
<li ng-repeat="item in data.langList" role="menuitem"><a title="${{{item.label}}}" role="button" ng-click="c.selectLanguage($index)" href="javascript:void(0);">${{{item.label}}}</a></li>
</ul>
</div>
</div>
</div>
<span class="title-secondary-data">
<span ng-if="data.revisionString" class="author pad-right text-nowrap">
<span ng-if="!c.isMobile && data.langList.length > 1" class="pad-right">•</span>
<i class="fa fa-user pad-right" />
{{data.revisionString}}
</span>
<span ng-if="!c.isMobile && data.externalArticle" class="pad-right text-nowrap">
{{data.messages.EXTERNAL_CONTENT}}
</span>
<br class="visible-xs"/>
<span class="published pad-right text-nowrap">
<span class="pad-right hidden-xs" ng-if="!c.isMobile">•</span> <i class="fa fa-calendar pad-right" />
<sn-time-ago timestamp="data.sys_updated_on"/>
</span>
<span ng-if="data.viewCount == 1" class="views pad-right text-nowrap">
<span class="pad-right">•</span> <i class="fa fa-eye pad-right" />
${{{::data.viewCount}} View}
</span>
<span ng-if="data.viewCount > 1" class="views pad-right text-nowrap">
<span class="pad-right">•</span> <i class="fa fa-eye pad-right" />
${{{::data.viewCount}} Views}
</span>
<span class="text-nowrap str-rating" ng-if="data.properties.showKBStarRating && data.properties.showKBRatingOptions && data.avgRating >= 0" title="{{::data.avgRating}} rating">
<span class="pad-right">•</span>
<span class="kb-rating-stars" ng-if="::c.KBRatingStyle">
<uib-rating sp-rating ng-model="::data.avgRating" max="5" aria-label="{{::data.messages.ARTICLE_RATING}}" aria-hidden="true" readonly="true"/>
</span>
<span class="sp-stars" ng-if="!c.KBRatingStyle">
<span uib-rating sp-rating ng-model="::data.avgRating" max="5" readonly="true" aria-label="{{::data.messages.ARTICLE_RATING}}" aria-hidden="true" state-on="'fa fa-star kb-star-on'" state-off="'fa fa-star kb-star-off'" />
</span>
</span>
</span>
<div class="row community-attribution" ng-if="!c.isMobile && data.hInfo">
<div class="contributor pad-right" ng-if="data.hInfo.contributor && data.hInfo.contributor.userId">
<i class="fa fa-globe" aria-hidden="true"></i>
<span class="pad-lr pad-right" ng-bind-html="data.hInfo.profileMessage"></span>
<span class="discussion-published pad-right pre-bullet-icon text-nowrap" ng-if="data.hInfo.postedOn">
${Posted}<sn-day-ago date="data.hInfo.postedOn"/>
</span>
<span class="discussion-link pad-right pre-bullet-icon text-nowrap" ng-if="data.hInfo.title">
<a href="?id=community_question&sys_id={{data.hInfo.sourceRoot}}" target="_blank_cm1">${Link to Discussion}</a>
</span>
</div>
</div>
<hr class="kb-header-line"/>
<article class="kb-article-content" ng-if="::data.articleType != 'wiki'">
<section ng-if="::!c.data.kbContentData.isTemplate" ng-bind-html="::c.data.kbContentData.data"/>
<section ng-if="::c.data.kbContentData.isTemplate" ng-repeat="field in c.data.kbContentData.data track by $index" style="{{field.field_style}}">
<h3 ng-if="::!field.collapsible" style="{{field.heading_style}}">{{field.label}}</h3>
<header class="collapsible-title" ng-if="::field.collapsible" tabindex="0" ng-click="c.toggleSection(field)">
<h3 style="{{::field.heading_style}}" tabindex="-1">{{field.label}}</h3>
<i class="fa fa-chevron-up rotate" ng-class="{'down': field.collapsed}" tabindex="-1"/>
</header>
<p id="{{::field.column}}" ng-if="::field.type != 'html' && field.collapsed" style="display:none;">{{field.content}}</p>
<p id="{{::field.column}}" ng-if="::field.type != 'html' && !field.collapsed">{{field.content}}</p>
<section id="{{::field.column}}" ng-if="::field.type == 'html' && field.collapsed" style="display:none;" ng-bind-html="::field.content"/>
<section id="{{::field.column}}" ng-if="::field.type == 'html' && !field.collapsed" ng-bind-html="::field.content"/>
</section>
</article>
<article class="kb-article-content" ng-if="::data.articleType == 'wiki'" ng-bind-html="::data.kbWiki"></article>
<hr class="kb-permalink-separator" ng-if="::!c.isMobile"/>
<p class="pull-right kb-permalink" ng-if="::!c.isMobile"><a href="javascript:void(2)" ng-click="c.copyPermalink()">{{::data.messages.COPY_PERMALINK}}</a></p>
</div>
</div>
<div ng-if="!data.isValid && !data.knowledgeExists" class="col-sm-12 panel-warning">
<div class="panel-heading">{{data.messages.RECORD_NOT_FOUND}}</div>
</div>
<div ng-if="!data.isValid && data.knowledgeExists" class="col-sm-12 panel-warning">
<div class="panel-heading">{{data.messages.INSUFFICIENT_PREVILEGES}}</div>
</div>
</div>
<style>
#uiNotificationContainer{
top : 10px;
}
.kb-article-wrapper .kb-desktop .kb-panel-title-header{
padding-left: 25px;
}
.kb-article-wrapper .app-modal-window .modal-dialog {
margin-top: 110px;
}
.kb-article-wrapper .kb-mobile{
letter-spacing: .6px;
}
.kb-article-wrapper .kb-mobile .title-secondary-data{
word-spacing:1px;
}
.kb-article-wrapper .kb-mobile .author{
margin-bottom: 17px;
}
.kb-article-content dl {
margin-top: .2em;
margin-bottom: .5em;
}
.kb-article-content dd {
line-height: 1.5em;
margin-left: 2em;
margin-bottom: .1em;
}
@media only screen and (max-width :992px){
.kb-article-wrapper .kb-desktop{
margin-top:15px;
}
.kb-article-wrapper .kb-wrapper{
padding : 10px !important;
}
.kb-article-wrapper .kb-menu-entry{
padding-top: 2px;
padding-bottom: 2px;
}
.kb-article-wrapper .kb-version-info{
margin-top : 5px !important;
}
.kb-article-wrapper .kb-desktop .kb-number-info{
margin-top : 6px !important;
padding-left: 10px;
}
.kb-article-wrapper .kb-mobile .kb-panel-title-header{
padding-left: 16px;
}
.kb-article-wrapper .kb-desktop .kb-panel-title-header{
padding-left: 0px;
}
}
@media only screen and (max-width :768px){
.kb-article-wrapper .right-col-padding{
padding-left : 25px !important;
}
}
@media only screen and (max-width: 750px) {
.kb-article-wrapper .kb-mobile .author{
margin-bottom: 0px;
}
}
@media only screen and (min-width: 992px) {
.kb-article-wrapper .app-modal-window .modal-dialog {
width: 750px;
}
.kb-article-wrapper .control-label{
float :right;
}
.kb-article-wrapper .left-col-padding{
padding-right : 30px !important;
}
.kb-article-wrapper .right-col-padding{
padding-left : 5px !important;
}
}
@media only screen and (min-width:768px) and (max-width: 992px) {
.kb-article-wrapper .app-modal-window .modal-dialog {
width: 600px;
}
.kb-article-wrapper .control-label{
float :right;
}
.kb-article-wrapper .left-col-padding{
padding-right : 5px !important;
}
.kb-article-wrapper .right-col-padding{
padding-left : 5px !important;
}
}
@media only screen and (max-width: 400px) {
.pad-right{
padding-right:0px !important;
}
}
@media only screen and (max-width: 376px) {
.kb-article-wrapper .kb-mobile{
letter-spacing: 0px;
}
.kb-article-wrapper .kb-mobile .title-secondary-data{
word-spacing:0px;
}
.kb-article-wrapper .kb-mobile .title-secondary-data .str-rating{
margin-top: 17px;
display: block;
}
.kb-article-wrapper .kb-mobile .title-secondary-data .str-rating .pad-right{
display: none;
}
}
</style>
Client Script:
function($rootScope, $scope, $window, $timeout, spUtil, $sce, spModal, $uibModal,$location,cabrillo) {
/* widget controller */
var c = this;
c.createIncident= function(){
c.server.get({action : 'insertincident',article_sys_id : c.data.article_sys_id});
c.data.status = false;
};
if (c.data.redirect) {
var id = $location.search().sys_kb_id ? 'sys_kb_id' : 'sys_id';
if ($location.search()[id] && $location.search()[id] !== c.data.redirect) {
$location.search('spa', 1);
$location.search(id, c.data.redirect);
}
}
if(typeof $rootScope.isOtherPortal == "undefined") {
if($location.search().sys_id != null) {
$rootScope.isOtherPortal = true;
} else {
$rootScope.isOtherPortal = false;
}
}
if(c.data.isValid){
if(c.data.kbContentData && c.data.kbContentData.isTemplate ){
c.data.kbContentData.data.forEach(function(field){
if(field.type == 'html')
field.content = $sce.trustAsHtml(field.content);
});
if (c.data.articleType === 'wiki')
c.data.kbWiki = $sce.trustAsHtml(c.data.kbWiki);
}
else if (c.data.articleType === 'wiki')
c.data.kbWiki = $sce.trustAsHtml(c.data.kbWiki);
else
c.data.kbContentData.data = $sce.trustAsHtml(c.data.kbContentData.data);
}
$scope.submitted = false;
c.flagMessage = null;
$timeout(function(){
$rootScope.$broadcast("sp.update.breadcrumbs", $scope.data.breadCrumb);
});
$rootScope.properties = $scope.data.properties;
$rootScope.messages = $scope.data.messages;
$rootScope.isValid = c.data.isValid;
$rootScope.isKBAdmin = $scope.data.isKBAdmin;
$rootScope.isKBOwner = $scope.data.isKBOwner;
$rootScope.article_sys_id = $scope.data.article_sys_id;
$rootScope.attachments = $scope.data.attachments;
$rootScope.attachedIncidents = $scope.data.attachedIncidents;
$rootScope.affectedProducts = $scope.data.affectedProducts;
$rootScope.displayAttachments = $scope.data.displayAttachments;
$rootScope.hideFeedbackOptions = $scope.data.hideFeedbackOptions;
$rootScope.helpfulContent = $scope.data.helpfulContent;
$rootScope.tableName = $scope.data.tableName;
$rootScope.hasComments = $scope.data.hasComments;
$scope.data.isSubscribed = $scope.data.isArticleSubscribed || $scope.data.isArticleSubscribedAtKB;
$scope.data.subscribeLabel = ($scope.data.isSubscribed ? $scope.data.messages.SUBSCRIBED : $scope.data.messages.SUBSCRIBE);
c.createIncidentURL = c.options.create_task_url || ($scope.data.properties && $scope.data.properties.createIncidentURL);
c.createIncidentLabel = c.options.create_task_prompt || $scope.data.messages.CREATE_INCIDENT;
c.showCreateIncident = c.data.isLoggedInUser && c.options.show_create_incident_action != 'false' && c.data.properties && c.data.properties.showKBCreateIncident && c.createIncidentURL;
c.showFlagArticle = c.data.properties && c.data.properties.showKBFlagArticle && c.data.properties.showRatingOptions;
c.showMenu = c.data.properties && (c.showFlagArticle || c.data.properties.isEditable || c.showCreateIncident);
$rootScope.stackUrl = window.location.pathname + '?id='+c.data.params.sysparm_article_view_page_id+'%26' + (c.data.params.sysparm_article ? 'sysparm_article=' + c.data.params.sysparm_article : 'sys_kb_id=' + c.data.params.sys_kb_id);
c.stackUrl = $rootScope.stackUrl;
c.flagMessage = '';
c.task ={};
c.imageInstance = '';
c.submitFlagWithoutComment = "${Please enter a comment to be able to flag the article}";
c.submitFlagWithComment = "${Press this button to flag the article}";
$scope.data.toggleSubscribed = ($scope.data.isSubscribed ? true : false);
c.reasons = c.data.feedback_reasons;
c.data.reason = '4';
c.imageInstance = '';
c.minImageHeight = parseInt(c.options.min_image_height) || 100;
c.minImageWidth = parseInt(c.options.min_image_width) || 185;
c.readOnly = false;
c.isMobile = spUtil.isMobile() || cabrillo.isNative();
//Use KB specific stylic for "kb" & 'mesp' portal
c.KBRatingStyle = c.options.kb_rating_style || ($rootScope.portal ? ($rootScope.portal.sys_id == "45d6680fdb52220099f93691f0b8f5ad" || $rootScope.portal.sys_id == "26f2fffb77322300454792718a1061e5") : false);
if(c.data.langList && c.data.langList.length > 1){
for(var lng in c.data.langList){
if(c.data.langList[lng].selected == true){
c.selectedLanguage = c.data.langList[lng];
break;
}
}
}
populateBreadCrumbURLs();
function populateBreadCrumbURLs() {
if(c.data.breadCrumb) {
if(c.data.breadCrumb[0].type == 'kb_knowledge_base') {
if($rootScope.isOtherPortal) {
c.data.breadCrumb[0].url = '?id=' + c.data.kb_knowledge_page + '&kb_id=' + c.data.breadCrumb[0].values.kb_knowledge_base;
} else {
c.data.breadCrumb[0].url = '?id=kb_search&kb_knowledge_base=' + c.data.breadCrumb[0].values.kb_knowledge_base;
}
}
for(var i = 1; i < c.data.breadCrumb.length; i++) {
if(c.data.breadCrumb[i].type == 'kb_category') {
if($rootScope.isOtherPortal) {
if(c.data.breadCrumb[i].values.kb_category == "NULL_VALUE") {
c.data.breadCrumb.splice(i, 1);
} else {
c.data.breadCrumb[i].url = '?id=kb_category&kb_id=' + c.data.breadCrumb[i].values.kb_knowledge_base + '&kb_category=' + c.data.breadCrumb[i].values.kb_category;
}
} else {
c.data.breadCrumb[i].url = '?id=kb_search&kb_knowledge_base=' + c.data.breadCrumb[i].values.kb_knowledge_base + '&kb_category=' + c.data.breadCrumb[i].values.kb_category;
}
}
}
}
}
if (c.data.page_title) {
// setting default page title for supporting km seo
$window.document.title = c.data.page_title;
if (c.data.article_sys_id)
appendKBSysIdToURL();
}
function appendKBSysIdToURL() {
if ($window) {
if (c.data.params.sys_kb_id) // return if url already contains sys_kb_id
return;
// for supporting km seo, adding kb_sys_id to the url when kb is viewed using sysparm_article (kb number)
$timeout(function() {
$location.search('sys_kb_id',scope.data.article_sys_id);
$location.search('spa','1');
});
}
}
c.showVersions = false;
c.toggleVersions = function(){
c.showVersions = !c.showVersions;
$('#kbVersionInfo').slideToggle("fast");
};
c.selectLanguage = function(ind){
$window.location.replace('?id='+c.data.params.sysparm_article_view_page_id+'&sys_kb_id=' + c.data.langList[ind].sys_id);
};
c.showActionMenu = function(){
if(c.showMenu){
return true;
}
else{
if(c.data.properties && c.data.properties.isSubscriptionEnabled && $window.innerWidth < 992)
return true;
else
return false;
}
}
c.toggleSection = function(field) {
field.collapsed = !field.collapsed;
$('#'+field.column).slideToggle("fast");
};
c.handleSubscribeButtonFocus = function(){
if($scope.data.isSubscribed){
$scope.data.subscribeLabel = $rootScope.messages.UNSUBSCRIBE;
$scope.data.toggleSubscribed = !$scope.data.toggleSubscribed;
}
};
c.handleSubscribeButtonBlur = function(){
if($scope.data.isSubscribed){
$scope.data.subscribeLabel = $rootScope.messages.SUBSCRIBED;
$scope.data.toggleSubscribed = !$scope.data.toggleSubscribed;
}
}
c.closeUnsubscribeModal = function(){
$("#unSubscribeModal").modal('hide');
};
c.handleSubscription = function(confirmation){
c.data.actionName = null;
if(!$scope.data.isSubscribed){
c.data.actionName = 'subscribe';
c.data.articleSysId = $scope.data.article_sys_id;
c.data.articleNum = $scope.data.number;
}
else
{
if($scope.data.isArticleSubscribed && !$scope.data.isArticleSubscribedAtKB){
c.data.actionName = "unsubscribe";
c.data.articleSysId = $scope.data.article_sys_id;
c.data.articleNum = $scope.data.number;
c.data.unsubscribeKB = false;
}
else if(!confirmation){
//$("#unSubscribeModal").modal();
var unsubscribeMessage = "<p>" + c.data.messages.UNSUBSCRIBE_CONTENT + "</p><p><b>" + c.data.messages.UNSUBSCRIBE_CONFIRMATION + "</b></p>";
spModal.open(
{
title: c.data.messages.UNSUBSCRIBE,
buttons : [{label : c.data.messages.NO, cancel : true}, {label: c.data.messages.YES, primary : true}],
message : unsubscribeMessage
}).then(function(){
c.handleSubscription('Y');
}, function(){
c.closeUnsubscribeModal();
});
return;
}
else if(confirmation === 'Y'){
c.data.actionName = "unsubscribe";
c.closeUnsubscribeModal();
c.data.articleSysId = $scope.data.article_sys_id;
c.data.kbSysId = $scope.data.kbSysId;
c.data.articleNum = $scope.data.number;
c.data.kbName = $scope.data.kbName;
c.data.unsubscribeKB = true;
}
}
c.server.get({action : c.data.actionName, kbSysId : c.data.kbSysId, kbName : c.data.kbName, articleSysId : c.data.articleSysId, articleNum : c.data.articleNum, unsubscribeKB : c.data.unsubscribeKB, isArticleSubscribed: c.data.isArticleSubscribed, isKBSubscribed : c.data.isArticleSubscribedAtKB}).then(function(resp){
if(c.data.actionName == 'subscribe'){
$scope.data.isArticleSubscribed = true;
$scope.data.isSubscribed = true;
$scope.data.subscribeLabel = $rootScope.messages.SUBSCRIBED;
}
else{
$scope.data.isArticleSubscribed = false;
$scope.data.isSubscribed = false;
$scope.data.isArticleSubscribedAtKB = false;
$scope.data.subscribeLabel = $rootScope.messages.SUBSCRIBE;
}
c.showUIMessage('info', resp.data.responseMessage);
});
};
c.submitFlagComments = function(){
if(!c.data.comment){
c.flagMessage = "${Please provide a comment to flag the article}";
$("#flagComment").focus();
return false;
}
else{
c.server.get({action : 'saveFlagComment', article_sys_id : c.data.article_sys_id, comment : c.data.comment}).then(function(resp){
if(resp.data.feedbackSuccess){
c.showUIMessage('info', c.data.messages.ARTICLE_FLAGGED);
c.clearComment();
}
else {
c.showUIMessage('error', c.data.messages.RATE_LIMIT_REACHED);
c.clearComment();
}
});
}
};
c.copyPermalink = function(){
var v = document.createElement('textarea');
var permalink = document.location.origin + document.location.pathname + '?id='+c.data.params.sysparm_article_view_page_id+'&sysparm_article=' + $scope.data.number;
v.innerHTML = permalink;
v.className = "sr-only";
document.body.appendChild(v);
v.select();
var result = true;
try {
result = document.execCommand('copy');
}
catch(err){
result = false;
}
finally{
document.body.removeChild(v);
}
if(result === true){
c.showUIMessage('info', c.data.messages.PERMALINK_COPIED);
}
else{
$window.prompt("${Because of a browser limitation the URL can not be placed directly in the clipboard. Please use Ctrl-C to copy the data and escape to dismiss this dialog}", permalink);
}
};
var modal = null;
c.launchFlagModal = function(){
c.clearComment();
modal = $uibModal.open(
{
title : c.data.messages.FLAG_THIS_ARTICLE,
scope : $scope,
templateUrl : 'kb-flag-article-modal'
});
}
var taskPopUp = $rootScope.$on("sp.kb.feedback.openTaskPopup",function(event,data){
c.ftask = {};
if(data){
c.launchFeedbackTaskModal();
c.ftask.feedback_action = data.feedback_data.action;
c.ftask.feedback_rating = data.feedback_data.rating
c.ftask.action= "createFeedbackTask";
}
});
c.launchFeedbackTaskModal = function(){
c.clearFeedbackTask();
modal = $uibModal.open({
title : c.data.messages.FEEDBACK,
windowClass : 'app-modal-window',
scope : $scope,
templateUrl : 'kb-feedback-task-modal'
});
modal.closed.then(function(){
if(!c.submitted){
c.data.reason = "4";
c.data.details ="";
}
if(c.ftask.action == "createFeedbackTaskWithFlagComment" && !c.submitted)
return;
modal = null;
c.server.get({action : c.ftask.action,
article_sys_id : c.data.article_sys_id,
reason : c.data.reason,
details : c.data.details,
feedback_action: c.ftask.feedback_action,
rating : c.ftask.feedback_rating
}).then(function(resp){
if(resp.data.responseMessage){
if(resp.data.feedbackSuccess){
c.showUIMessage('info', resp.data.responseMessage);
}else{
c.showUIMessage('error', resp.data.responseMessage);
}
}
});
c.clearFeedbackTask();
});
}
c.clearComment = function(){
$scope.data.comment = '';
c.flagMessage = '';
c.closePopup();
}
c.showUIMessage = function(type,msg){
if(cabrillo.isNative()){
cabrillo.message.showMessage(type != 'error' ? cabrillo.message.SUCCESS_MESSAGE_STYLE : cabrillo.message.ERROR_MESSAGE_STYLE, msg);
}else{
if(type == 'error')
spUtil.addErrorMessage(msg);
else
spUtil.addInfoMessage(msg);
}
}
c.closePopup = function(){
if(modal){
modal.dismiss();
}
}
c.clearFeedbackTask = function(){
c.submitted = false;
c.data.reason = '4';
c.data.details = '';
c.flagMessage = '';
c.ftask = {};
c.closePopup();
}
c.submitFeedbackTask = function(){
if(!c.data.reason){
c.flagMessage = "${Please provide the mandatory details}";
$("#detailsComment").focus();
return false;
}
else{
c.submitted = true;
c.closePopup();
}
}
c.imgModalClose = function(){
c.imageInstance.close();
}
$scope.$on("$destroy", taskPopUp);
}
Server Script:
data.tsQueryId = $sp.getParameter("sysparm_tsqueryId") || "";
var isMESP = (options.is_mobile && options.is_mobile == "true") || ($sp.getParameter("id") == "me_kb_view") || false;
options.kb_rating_style = options.kb_rating_style ? options.kb_rating_style == "true" : false;
if(!input){
var kbViewModel = new global.KBViewModel();
var kbPortal = new sn_km_portal.KBPortalService();
populateParameters();
kbViewModel.getInfoForSP(data.params);
var isValidRecord = kbViewModel.isValid;
if (options.redirect_latest == 'true' && isValidRecord && kbViewModel.knowledgeRecord && kbViewModel.versioningInfo.newVersionAvailable) {
data.params.sys_kb_id = kbViewModel.versioningInfo.history[0].sysId;
data.redirect = data.params.sys_kb_id;
kbViewModel = new global.KBViewModel();
kbViewModel.getInfoForSP(data.params);
isValidRecord = kbViewModel.isValid;
}
data.knowledgeExists = kbViewModel.knowledgeExists;
data.kb_knowledge_page = $sp.getDisplayValue("kb_knowledge_page") || "kb_view2";
data.messages = {};
data.langList = [];
var tsQueryId = $sp.getParameter("sysparm_tsqueryId");
var rank = $sp.getParameter("sysparm_rank");
if(tsQueryId && rank && tsQueryId != ""){
kbViewModel.updateTsQueryKbWithRank(tsQueryId,rank);
}
options.knowledge_bases = options.knowledge_bases || String(kbPortal.getServicePortalKnowledgeBases($sp.getPortalRecord().url_suffix)) || "";
var knowledgeRecord = kbViewModel.knowledgeRecord;
if(options.knowledge_bases && knowledgeRecord && knowledgeRecord.kb_knowledge_base ){
if(options.knowledge_bases.indexOf(knowledgeRecord.kb_knowledge_base) == -1)
if(!kbPortal.isMemberOfAOG(knowledgeRecord))
isValidRecord = false;
}
if (isValidRecord && knowledgeRecord) {
data.isKBAdmin = kbViewModel.isAdminUser(knowledgeRecord);
data.isKBOwner = (gs.getUserID() == knowledgeRecord.kb_knowledge_base.owner);
populateDataFromKBViewModel();
// fetching default page title to support km seo
data.page_title = getPageTitle();
populateMessages();
populateCommonProperties();
if(!isMESP){
populateBreadCrumbs();
populateVersionInfo();
}
handleViewCountIncrement();
if(!isMESP)
populateContributorInfo();
if(data.articleType === 'wiki'){
initGlideWiki();
}
data.sys_updated_on = "";
if (kbViewModel.publishedRecord) {
published = kbViewModel.publishedRecord.published;
data.sys_updated_on = kbViewModel.publishedRecord.sys_updated_on + "";
}
data.shortDesc = knowledgeRecord.short_description + "";
populateSystemProperties();
getFeedbackReasonValues();
if(data.properties.showAffectedProducts === 'true' || data.properties.showAffectedProducts === true){
populateAffectedProducts();
}
if(data.properties.showAttachedTasks === true || data.properties.showAttachedTasks === 'true'){
populateAttachedTasks();
}
$sp.logStat('KB Article View', "kb_knowledge", knowledgeRecord.sys_id, knowledgeRecord.short_description);
}
else{
data.messages.INSUFFICIENT_PREVILEGES = gs.getMessage("You do not have sufficient privileges to access this knowledge item");
data.messages.RECORD_NOT_FOUND = gs.getMessage("Knowledge record not found");
}
}
if(input){
if(input.action == 'insertincident'){
console.log(input.article_sys_id);
var gr1 = new GlideRecord('kb_knowledge');
gr1.addQuery('sys_id',input.article_sys_id);
gr1.query();
if(gr1.next()){
var gr = new GlideRecord('incident');
gr.initialize();
gr.parent_incident = gr1.u_parent_incident;
gr.short_description = gr1.u_parent_incident.short_description;
gr.description= gr1.u_parent_incident.description;
gr.insert();
}
console.log(gr1.sys_id);
}
if(input.action === 'saveFlagComment'){
var kbPortal = new KBPortalService();
var params = {};
params.sysparm_id = input.article_sys_id;
params.feedback = input.comment;
params.sysparm_flag = "true";
params.ts_queryId = data.tsQueryId;
var response = kbPortal.kbWriteCommentWithParams(params);
var resp = new global.JSON().decode(response);
data.feedbackSuccess=resp.success;
}
if(input.action == 'createFeedbackTask'){
var response;
var kbPortal = new KBPortalService();
var successMessage = options.feedback_message ? options.feedback_message : gs.getMessage('Thank you, we appreciate your feedback');
var max_daily_comments = gs.getProperty("glide.knowman.max_comments_per_user_daily",'0');
var failureMessage = parseInt(max_daily_comments)>0? gs.getMessage("You have reached the daily limit for comments posted by a user."):gs.getMessage('Failed to save feedback');
var params = buildParams();
params.reason = input.reason;
params.comments = input.details;
if(input.feedback_action == "useful_no"){
params.useful = "no";
response = kbPortal.saveUsefulWithParams(params) + '';
}else if(input.feedback_action == "rating"){
params.rating = input.rating;
response = kbPortal.saveStarRatingWithParams(params) + '';
}
data.responseMessage = response.includes('true') ? successMessage : failureMessage;
var resp = new global.JSON().decode(response);
data.feedbackSuccess = resp.success;
}
if(input.action === 'subscribe'){
var subResult = subscribeObject('Article', input.articleSysId, gs.getUserID());
if(subResult){
data.responseMessage = gs.getMessage("You are now subscribed to {0}. You will be notified of any new activity according to your notification settings.", input.articleNum);
}
}
if(input.action === 'unsubscribe'){
var subResult = false;
if(input.unsubscribeKB){
subResult = unsubscribeObject('KB', input.articleSysId, input.kbSysId);
if(subResult === 'Article'){
data.responseMessage = gs.getMessage("Your subscriptions to {0} Knowledge Base and {1} have been removed.", [input.kbName, input.articleNum]);
}
else{
data.responseMessage = gs.getMessage("Your subscription to {0} Knowledge Base has been removed.", input.kbName);
}
}
else{
subResult = unsubscribeObject('Article', input.articleSysId, null);
if(subResult){
data.responseMessage = gs.getMessage("Your subscription to {0} has been removed.", input.articleNum);
}
}
}
if(input.action == 'kbAttachArticle'){
var kAjax = new global.KnowledgeAjax();
data.articleContent = kAjax.kbAttachArticleImpl(input.value);
}
}
function buildParams(){
var params = {};
params.article = input.article_sys_id;
params.sysparm_id = input.article_sys_id;
params.ts_queryId = data.tsQueryId;
params.session_id = gs.getSessionID();
params.user = gs.getUserID();
return params;
}
function subscribeObject(type, sysId, userId){
var kAjax = new global.KnowledgeAjax();
return kAjax.subscribeKbArticle(sysId, "7d8f537453003200fa9bd7b08cc5872c");
}
function unsubscribeObject(type, articleSysId, kbSysId){
var kAjax = new global.KnowledgeAjax();
if(type === 'Article'){
return kAjax.unsubscribeKbArticle(articleSysId);
}
else{
return kAjax.unsubscribeKB(articleSysId, kbSysId);
}
}
function populateMessages(){
data.messages.REASON = gs.getMessage("Reason");
data.messages.DETAILS = gs.getMessage("Details");
data.messages.FEEDBACK = gs.getMessage("Feedback");
data.messages.THANKYOU_FEEDBACK = gs.getMessage("Thank you for the feedback");
data.messages.ADDTIONAL_DETAILS = gs.getMessage("Please provide additional details");
data.messages.NO_THANKS = gs.getMessage("No thanks");
data.messages.ADD_DETAIL = gs.getMessage("Add a Detail Comment");
data.messages.ARTICLE_FLAGGED = gs.getMessage("Article has been flagged");
data.messages.FLAG_THIS_ARTICLE = gs.getMessage("Flag this article");
data.messages.ADD_COMMENT = gs.getMessage("Add a comment (mandatory)");
data.messages.NOT_RETIRED = gs.getMessage("Article not retired");
data.messages.NOT_PUBLISHED = gs.getMessage("Article not published");
data.messages.NOT_SAVED = gs.getMessage("Article not saved");
data.messages.SAVED = gs.getMessage("Article saved");
data.messages.HOME = gs.getMessage('Home');
data.messages.DISCARDED = gs.getMessage("Article changes discarded");
data.messages.SUBMITTED = gs.getMessage("Your article has been submitted");
data.messages.PREVIEW = gs.getMessage(" Preview ");
data.messages.PREVIEW_HINT = gs.getMessage("Preview changes");
data.messages.DELETE = gs.getMessage("Delete");
data.messages.CONFIRM_DELETE = gs.getMessage("Confirm deletion of this article?");
data.messages.TITLE_CANCEL = gs.getMessage("Cancel changes");
data.messages.MESSAGE_CANCEL = gs.getMessage("Discard all changes?");
data.messages.TITLE_RETIRE = gs.getMessage("Retire");
data.messages.MESSAGE_RETIRE = gs.getMessage("Retire this article?");
// Status messages for the message bar.
data.messages.DRAFT_MSG = gs.getMessage("This knowledge item has been created");
data.messages.REVIEW_MSG = gs.getMessage("This knowledge item has been published");
data.messages.PUBLISHED_MSG = gs.getMessage("This knowledge item has been published");
data.messages.PEND_RETIRE_MSG = gs.getMessage("This knowledge item has been retired");
data.messages.RETIRED_MSG = gs.getMessage("This knowledge item has been retired");
data.messages.DELETE_FAIL_MSG = gs.getMessage("This article could not be deleted");
data.messages.TXT_PLACEHOLDER = gs.getMessage("Add content");
data.messages.LATEST_VERSION = gs.getMessage("Latest version");
data.messages.SUBSCRIBE = gs.getMessage("Subscribe");
data.messages.UNSUBSCRIBE = gs.getMessage("Unsubscribe");
data.messages.COPY_PERMALINK = gs.getMessage("Copy Permalink");
data.messages.SUBMIT = gs.getMessage('Submit');
data.messages.COMMENTS = gs.getMessage('Comments');
data.messages.AFFECTED_PRODUCTS = gs.getMessage('Affected Products');
data.messages.OUTDATED = gs.getMessage('Outdated');
data.messages.KNOWLEDGE_BASE = gs.getMessage('Knowledge Base');
data.messages.KNOWLEDGE = gs.getMessage('Knowledge');
data.messages.ATTACHED_INCIDENTS = gs.getMessage("Most recent tasks");
data.messages.THANK_YOU = gs.getMessage("Thank you");
data.messages.RATE_LIMIT_REACHED = gs.getMessage("You have reached the daily limit for comments posted by a user.");
data.messages.NO_ATTACHMENTS = gs.getMessage("No attachments found");
data.messages.NO_INCIDENTS = gs.getMessage("No tasks found");
data.messages.NO_PRODUCTS = gs.getMessage("No affected products found");
data.messages.EDIT = gs.getMessage("Edit");
data.messages.ATTACHMENTS = gs.getMessage('Attachments');
data.messages.HELPFUL = gs.getMessage('Helpful?');
data.messages.CREATE_INCIDENT = gs.getMessage("Create Incident");
data.messages.FLAG_ARTICLE = gs.getMessage("Flag Article");
data.messages.PERMALINK_COPIED = gs.getMessage("Permalink copied successfully");
data.messages.SUBSCRIPTION_CONFIRMATION = gs.getMessage("You are now subscribed to {0}. You will be notified of any new activity according to your notification settings", data.number);
data.messages.SUBSCRIBED = gs.getMessage("Subscribed");
data.messages.YES = gs.getMessage("Yes");
data.messages.NO = gs.getMessage("No");
data.messages.UNSUBSCRIBE_CONTENT = gs.getMessage("In order to unsubsrcibe from this article, you will need to unsubscribe from the parent knowledge base: {0}. ", data.kbName);
data.messages.UNSUBSCRIBE_CONFIRMATION = gs.getMessage("Would you like to unsubscribe from {0}", data.kbName);
data.messages.CANCEL = gs.getMessage("Cancel");
data.messages.ACTION_MENU = gs.getMessage("Action Menu. Please click for available actions on the article");
data.messages.CLOSE = gs.getMessage("Close");
data.messages.JUST_NOW = gs.getMessage("just now");
data.messages.ARTICLE_RATING = gs.getMessage("Average article rating - {0} stars", data.avgRating);
data.messages.EXTERNAL_CONTENT = gs.getMessage(gs.getProperty("sn_km_intg.glide.knowman.external.ui_label_for_external_content", "External Content"));
if(data.params.sysparm_kb_search_table){
var label = new GlideRecord(data.params.sysparm_kb_search_table).getLabel();
if(label)
data.messages.ATTACH_TO_TASK_LABEL = gs.getMessage("Attach to {0}", label);
else
data.messages.ATTACH_TO_TASK_LABEL = gs.getMessage("Attach to record");
}
}
function populateParameters(){
data.params = {};
data.params.sysparm_article = $sp.getParameter('sysparm_article');
data.params.sysparm_language = $sp.getParameter('sysparm_language');
data.params.sys_kb_id = $sp.getParameter('sys_kb_id') || $sp.getParameter('sys_id');
data.params.sysparm_no_update = $sp.getParameter('sysparm_no_update');
data.params.sysparm_no_suggest = $sp.getParameter('sysparm_no_suggest');
data.params.sysparm_no_info = $sp.getParameter('sysparm_no_info');
data.params.sysparm_no_create_incident = $sp.getParameter('sysparm_no_create_incident');
data.params.sysparm_ts_queryId = $sp.getParameter('sysparm_tsqueryId');
data.params.sysparm_article_view_page_id = $sp.getParameter('id');
data.params.sysparm_kb_search_table = $sp.getParameter('sysparm_kb_search_table')||'';
}
function populateSystemProperties(){
data.properties = {};
data.properties.showStarRating = getProperty("glide.knowman.show_star_rating", "show_star_rating", true, true);
data.properties.showRatingOptions = getProperty("glide.knowman.show_rating_options", "show_rating_options", true, true);
data.properties.showYesNoRatings = getProperty("glide.knowman.show_yn_rating", "show_yn_rating", true, true);
//data.properties.showFlagArticle = getProperty("glide.knowman.show_flag", "show_flag", true, true);
//data.properties.showFlagArticle = data.properties.showFlagArticle && !params.sysparm_no_suggest && !knowledgeRecord.disable_suggesting;
data.properties.showUserComments = getProperty("glide.knowman.show_user_feedback", "show_user_feedback", 'onload');
data.properties.showAffectedProducts = gs.getProperty('glide.knowman.affected_products.display','true');
data.properties.showAttachedTasks = gs.getProperty('glide.knowman.recent_tasks.display','true');
data.properties.attachFields = gs.getProperty('glide.knowman.attach.fields');
if(data.properties.showAttachedTasks === 'true'){
data.properties.showAttachedTasks = gs.hasRole('itil') || gs.hasRole('knowledge');
}
data.properties.showCreateIncident = !kbViewModel.isInPopup && !data.params.sysparm_no_create_incident;
data.properties.createIncidentURL = getProperty('glide.knowman.create_incident_link', 'create_incident_link', '', false);
data.properties.isSubscriptionEnabled = kbViewModel.isSubscriptionEnabled;
data.properties.isEditable = kbViewModel.isEditable;
data.properties.showFeedBack = kbViewModel.showKBFeedback;
data.properties.showKBRatingOptions = kbViewModel.showKBRatingOptions;
data.properties.showKBHelpfullRating = kbViewModel.showKBHelpfullRating;
data.properties.showKBStarRating = kbViewModel.showKBStarRating;
data.properties.showKBCreateIncident = kbViewModel.showKBCreateIncident;// && !kbViewModel.isInPopup && !params.sysparm_no_create_incident;
data.properties.showKBFlagArticle = kbViewModel.showKBFlagArticle && !data.params.sysparm_no_suggest && !knowledgeRecord.disable_suggesting;
data.properties.showKBUpdateAction = kbViewModel.showKBUpdateAction;
data.properties.readOnlyPage = gs.getProperty('glide.knowman.contextual_search.show_read_only_article','false');
}
function getProperty(propertyName, optionName, defaultValue, checkRoles){
var optionVal = options[optionName];
if(!optionVal || optionVal === 'use_system' || !(optionVal === 'yes' || optionVal === 'no') ){
var propValue = gs.getProperty(propertyName, defaultValue);
if(propValue && checkRoles){
var roles = gs.getProperty(propertyName + '.roles');
if (roles != null && roles != ''){
propValue = gs.hasRole(roles);
}
}
return propValue;
}
else {
return optionVal === 'yes' ? true : false;
}
}
function populateCommonProperties(){
data.isMobileView = ($sp.getParameter('sysparm_device') != "" && $sp.getParameter('sysparm_device') == "mobile");
data.isKBLanguagesNewUI = GlidePluginManager.isActive('com.glideapp.knowledge.i18n2');
if(data.isKBLanguagesNewUI){
data.langList = kbViewModel.getLanguagesToDisplay(knowledgeRecord);
}
}
function populateDataFromKBViewModel(){
data.isValid = true;
data.isLoggedInUser = gs.getSession().isLoggedIn();
data.canContributeToKnowledge = kbViewModel.canContributeToKnowledgeBase; //canContributeHelper.canContribute(kbViewModel.knowledgeRecord);
data.article_sys_id = knowledgeRecord.sys_id + '';
data.authorTitle = kbViewModel.authorTitle || kbViewModel.getAuthorInfo("author.title");
data.kbContentData = kbViewModel.getArticleViewData();
data.avgRating = Math.round(knowledgeRecord.rating);
data.number = knowledgeRecord.number + '';
data.parentIncident = knowledgeRecord.u_parent_incident;
if(data.parentIncident==''){
data.status = false;
}
else{
console.log(data.parentIncident.number);
var gr2 = new GlideRecord('incident');
gr2.addQuery('parent_incident',data.parentIncident);
gr2.addQuery('sys_created_by',gs.getUserName());
gr2.query();
console.log(gr2.getRowCount());
if(gr2.getRowCount() > 0){
data.status = false;
}
else{
data.status = true;
}
}
data.articleType = knowledgeRecord.article_type + '';
data.permalink = kbViewModel.permalink;
data.category = knowledgeRecord.category;
data.attachments = kbViewModel.attachments;
data.shortDesc = knowledgeRecord.short_description + "";
data.viewCount = knowledgeRecord.getDisplayValue('sys_view_count');
data.displayAttachments = knowledgeRecord.display_attachments + '';
data.tableName = knowledgeRecord.sys_class_name + '';
data.disableSuggesting = knowledgeRecord.disable_suggesting;
data.revisionString = kbViewModel.revisionString;
data.articleTemplate = kbViewModel.articleTemplateName;
data.isSubscriptionEnabled = kbViewModel.isSubscriptionEnabled;
data.helpfulContent = kbViewModel.helpfulText;
if(data.isSubscriptionEnabled === true && !isMESP){
data.isArticleSubscribed = (new global.ActivitySubscriptionContext().getSubscriptionService().isSubscribed(knowledgeRecord.sys_id).subscriptionId) ? true : false;//kbViewModel.isArticleSubscribed;
data.isArticleSubscribedAtKB = (new global.ActivitySubscriptionContext().getSubscriptionService().isSubscribed(knowledgeRecord.kb_knowledge_base).subscriptionId) ? true : false;//kbViewModel.isArticleSubsrcibedAtKB;
}
else{
data.isArticleSubscribed = false;
data.isArticleSubscribedAtKB = false;
}
data.kbSysId = knowledgeRecord.kb_knowledge_base.sys_id + '';
data.kbName = knowledgeRecord.kb_knowledge_base.getDisplayValue() + '';
data.externalArticle = kbViewModel.externalArticle;
data.hasComments = !kbViewModel.feedbackEntryInitialDisplay;
data.isTaskTable = data.params.sysparm_kb_search_table ? kbViewModel.isTaskTable(data.params.sysparm_kb_search_table) : false;
}
function populateBreadCrumbs(){
var breadCrumb = kbViewModel.getBreadcrumb();
data.breadCrumb = [];
data.breadCrumb.push({label: knowledgeRecord.kb_knowledge_base.title + ' (' + data.messages.KNOWLEDGE_BASE + ')', type: 'kb_knowledge_base', values: {kb_knowledge_base: knowledgeRecord.kb_knowledge_base.sys_id + ''}});
var ctg = '';
for(var i = 0; i < breadCrumb.length; i++){
ctg += breadCrumb[i].name;
if(i != breadCrumb.length - 1){
ctg += ' - ';
}
}
if(ctg !== '' && breadCrumb && breadCrumb.length > 0){
data.breadCrumb.push({label: ctg + '', type: 'kb_category', values: {kb_knowledge_base: breadCrumb[breadCrumb.length - 1].knowledge_base + '', kb_category: breadCrumb[breadCrumb.length - 1].value + ''}});
}
}
function handleViewCountIncrement(){
knowledgeRecord.incrementViewCount();
var viewCountGR = new GlideRecord('kb_knowledge');
if(viewCountGR.get(knowledgeRecord.sys_id))
data.viewCount = viewCountGR.getValue('sys_view_count');
}
function initGlideWiki(){
try{
data.kbWiki = kbViewModel.getWikiContent();
}
catch(e){
data.kbWiki = '';
}
}
function populateAttachedTasks(){
data.attachedIncidents = [];
data.attachedIncidents = kbViewModel.getAttachedTasks();
}
function populateAffectedProducts(){
data.affectedProducts = [];
data.affectedProducts = kbViewModel.getAffectedProducts();
}
function populateVersionInfo(){
data.isVersioningEnabled = kbViewModel.versioningInfo.isEnabled;
data.versionList = kbViewModel.versioningInfo.history;
data.version = knowledgeRecord.getDisplayValue('version');
data.isLatestVersion = !(kbViewModel.versioningInfo.newVersionAvailable === true);
data.workflowState = (knowledgeRecord.workflow_state != 'published') ? ('(' + knowledgeRecord.workflow_state.getDisplayValue() + ')') : '';
data.versionInfo = kbViewModel.versioningInfo.versionDisplay;//((kbViewModel.versioningInfo.newVersionAvailable === true) ? 'v' + data.version : data.messages.LATEST_VERSION);
data.versionInfoLabel = kbViewModel.versioningInfo.versionDisplayLabel;
data.showHistory = kbViewModel.versioningInfo.showHistory;
data.hideFeedbackOptions = kbViewModel.hideFeedbackOptions;
data.versionWarningMessage = kbViewModel.versioningInfo.warningMessage;
if(data.versionWarningMessage){
data.versionWarningMessage = data.versionWarningMessage.replace('kb_view.do?', '?id='+data.params.sysparm_article_view_page_id+'&');
}
}
function populateContributorInfo(){
if(!GlidePluginManager.isActive('com.sn_communities')) return;
if(sn_communities.CommunityKnowledgeHarvest){
var h = new sn_communities.CommunityKnowledgeHarvest();
var res = h.getHarvestedContentInfo(''+knowledgeRecord.sys_id);
if(res && res.status == 200){
data.hInfo = res.data;
if(data.hInfo){
var message = gs.getMessage("Created from the Community by {0}");
var contributor = data.hInfo.contributor;
var profile = gs.getMessage('Community user');
if(contributor){
profile = contributor.name.length > 0 ? contributor.name : profile;
if(contributor.userId)
profile = '<a href="?id=community_user_profile&user='+contributor.userId+'" target="_blank_cm1" >'+profile+'</a>';
}
message = message.replace('{0}', profile);
data.hInfo.profileMessage = message;
}
}
}
}
function getFeedbackReasonValues(){
data.feedback_reasons=[];
var kbFbTask = new global.KBFeedbackTask();
var response = kbFbTask.getReasonValues();
if(response){
data.feedback_reasons = new global.JSON().decode(response);
}
}
function getPageTitle() {
var title = gs.getMessage("Knowledge Article View");
if (!gs.nil(data.article_sys_id)) // kb record found
title = knowledgeRecord.kb_knowledge_base.getDisplayValue() + " - " + data.shortDesc; // kb name - kb short_desc
else if (!gs.nil(data.params.sysparm_article_view_page_id)) {
// kb record NOT found - fetching the kb_article_view portal page title
var kbPage = new GlideRecord('sp_page');
kbPage.addQuery("id",data.params.sysparm_article_view_page_id+"");
kbPage.query();
if(kbPage.next())
title = kbPage.getValue('title');
}
return title;
}