Name

global.KBMyKnowledgeSNC

Description

WARNING Customers should NOT modify this script The purpose of this script include is to provide default behaviours for the widgets on My Knowledge page. To change the behaviour of these methods (or add new methods), customers should override/add new methods to the KBMyKnowledge script include.

Script

var KBMyKnowledgeSNC = Class.create();

KBMyKnowledgeSNC.prototype = Object.extendsObject(KBCommon, {
  KB_KNOWLEDGE: "kb_knowledge",
  KB_FEEDBACK: "kb_feedback",
  _TRUNCATE_LENGTH: 50,
  _ELLIPSES: "...",
  _DEFAULT_WINDOW_SIZE: 5,
  _DEFAULT_WINDOW_START: 0,

  initialize: function(type, windowStart) {
      KBCommonSNC.prototype.initialize.call(this);

      this.knowledgeType = type;
      this.windowSize = this._DEFAULT_WINDOW_SIZE;
      this.windowPosition = (windowStart || this._DEFAULT_WINDOW_START) - 0;
  },

  setWindowSize: function(size) {
      this.windowSize = parseInt(size);
  },

  setWindowPosition: function(position) {
      this.windowPosition = parseInt(position);
  },

  getArticles: function() {
      if (this.knowledgeType === "")
          return {};

      if (this.knowledgeType == "published")
          return this._getPublished();

      if (this.knowledgeType == "retired")
          return this._getRetired();

      if (this.knowledgeType == "comments")
          return this._getComments();

      if (this.knowledgeType == "suggested_edits")
          return this._getSuggestedEdits();
  },

  _getPublished: function() {
      var response = {};
      var usingWindow = false;

      var articles = new GlideRecord(this.KB_KNOWLEDGE);
      articles.addQuery("workflow_state", "published");
      articles.orderByDesc("published");
      articles.query();

      response["header_columns"] = this._getFieldDetails(articles, [ "short_description", "published" ]);
      response["results"] = [];
      response["has_more"] = false;

      var index = this.windowPosition;
      if (index > 0)
          articles.setLocation(index);

      while (articles.next()) {
          if (!this._canAccess(articles))
              continue;

          if (index == this.windowPosition + this.windowSize) {
              response["has_more"] = true;
              break;
          }

          response["results"].push({
              "short_description": {
                  "truncated": this._truncate(articles.short_description),
                  "complete": articles.short_description + ""
              },
              "published": articles.published.getDisplayValue(),
              "link": this._getKnowledgeLink(articles.getUniqueValue())
          });

          index++;
      }

      response["window"] = {
          "start": this.windowPosition,
          "end": articles.getLocation() - 1
      };

      return response;
  },

  _getRetired: function() {
      var response = {};

      var retired = new GlideRecord(this.KB_KNOWLEDGE);
      retired.addQuery("workflow_state", "retired");
      retired.orderByDesc("sys_updated_on");
      retired.query();

      response["header_columns"] = this._getFieldDetails(retired, [ "short_description", "sys_updated_on" ]);
      response["results"] = [];
      response["has_more"] = false;

      var index = this.windowPosition;
      if (index > 0)
          retired.setLocation(index);

      while (retired.next()) {
          if (!this._canAccess(retired))
              continue;

          if (index == this.windowPosition + this.windowSize) {
              response["has_more"] = true;
              break;
          }

          response["results"].push({
              "short_description": {
                  "truncated": this._truncate(retired.short_description),
                  "complete": retired.short_description + ""
              },
              "retired": !retired.retired ? "" : retired.retired.getGlideObject().getDate().getDisplayValue(),
              "link": this._getKnowledgeLink(retired.getUniqueValue())
          });

          index++;
      }

      response["window"] = {
          "start": this.windowPosition,
          "end": retired.getLocation() - 1
      };

      return response;
  },

  _getComments: function(response) {
      var response = {};

      var feedback = new GlideRecord(this.KB_FEEDBACK);
      feedback.addQuery("article.workflow_state", "!=", "retired");
      feedback.addQuery("flagged", false);
      feedback.addNullQuery("useful");
      feedback.addNullQuery("rating");
      feedback.addNotNullQuery("comments")
      feedback.orderByDesc("sys_created_on");
      feedback.query();

      response["header_columns"] = this._getFieldDetails(feedback, [ "article", "comments", "sys_created_on" ]);
      response["results"] = [];
      response["has_more"] = false;

      var index = this.windowPosition;
      if (index > 0)
          feedback.setLocation(index);

      while (feedback.next()) {
          if (!feedback.canWrite())
              continue;

          if (index == this.windowPosition + this.windowSize) {
              response["has_more"] = true;
              break;
          }

          response["results"].push({
              "sys_id": feedback.sys_id + "",
              "number": feedback.article.number + "",
              "comments": {
                  "truncated": this._truncate(feedback.comments),
                  "complete": feedback.comments + ""
              },
              "sys_created_on": feedback.sys_created_on.getGlideObject().getDate().getDisplayValue(),
              "user": feedback.user.getDisplayValue(),
              "link": "kb_view.do?sys_kb_id=" + feedback.article,
          });

          index++;
      }

      response["window"] = {
          "start": this.windowPosition,
          "end": feedback.getLocation() - 1
      };

      return response;
  },

  _getSuggestedEdits: function(response) {
      var response = {};

      var feedback = new GlideRecord(this.KB_FEEDBACK);
      feedback.addQuery("article.workflow_state", "!=", "retired");
      feedback.addQuery("flagged", true);
      feedback.addNotNullQuery("comments")
      feedback.orderByDesc("sys_created_on");
      feedback.query();

      response["header_columns"] = this._getFieldDetails(feedback, [ "article", "comments", "sys_created_on" ]);
      response["results"] = [];
      response["has_more"] = false;

      var index = this.windowPosition;
      if (index > 0)
          feedback.setLocation(index);

      while (feedback.next()) {
          if (!feedback.canWrite())
              continue;

          if (index == this.windowPosition + this.windowSize) {
              response["has_more"] = true;
              break;
          }

          response["results"].push({
              "sys_id": feedback.sys_id + "",
              "number": feedback.article.number + "",
              "comments": {
                  "truncated": this._truncate(feedback.comments),
                  "complete": feedback.comments + ""
              },
              "sys_created_on": feedback.sys_created_on.getGlideObject().getDate().getDisplayValue(),
              "user": feedback.user.getDisplayValue(),
              "link": "kb_view.do?sys_kb_id=" + feedback.article,
          });

          index++;
      }

      response["window"] = {
          "start": this.windowPosition,
          "end": feedback.getLocation() - 1
      };

      return response;
  },

  _getKnowledgeLink: function(id) {
      return "kb_view.do?sys_kb_id=" + id;
  },

  _getFieldDetails: function(gr, fields) {
      var fieldDetails = {};

      if (!gr || !fields || fields.length == 0)
          return fieldDetails;

      for (var i = 0; i < fields.length; i++) {
          var element = gr.getElement(fields[i]);
          fieldDetails[element.getName()] = element.getLabel();
      }

      return fieldDetails;
  },

  _truncate: function(value) {
      value = value + "";
      return value.length >= this._TRUNCATE_LENGTH ? value.substring(0, this._TRUNCATE_LENGTH) + this._ELLIPSES : value;
  },

  _canAccess: function(kbGR) {
      if (!kbGR)
          return false;

      if (this.isRecordVersion3(kbGR))
          return new KBKnowledge().canRead(kbGR) && this._knowledgeHelper.canContribute(kbGR);
      else if (this.isRecordVersion2(kbGR))
          return kbGR.canRead() && kbGR.canWrite();

      return false;
  },

  type: "KBMyKnowledgeSNC"
});

Sys ID

aef321f1d73221004792a1737e6103a4

Offical Documentation

Official Docs: