Name

sn_sow_collab.SOWSidebarChatUtilsSNC

Description

No description available

Script

var SOWSidebarChatUtilsSNC = Class.create();
SOWSidebarChatUtilsSNC.prototype = {
  initialize: function() {},

  TABLES: {
      SYS_CS_COLLAB_RECORD: 'sys_cs_collab_record',
      INCIDENT: 'incident',
      SYS_USER_HAS_ROLE: 'sys_user_has_role'
  },

  FIELDS: {
      TABLE: 'table',
      DOCUMENT: 'document',
      SYS_ID: 'sys_id',
      COLLAB_CHAT: 'collab_chat',
      TITLE: 'title',
      SYS_UPDATED_ON: 'sys_updated_on',
      SYS_CREATED_BY: 'sys_created_by',
      CALLER_ID: 'caller_id',
      USER: 'user',
      ROLE: 'role'
  },

  COLLAB_MEMBER_FIELDS: {
      USER_NAME: 'userName',
      DISPLAY_NAME: 'displayName',
      AVATAR: 'avatar',
      EMAIL: 'email',
      SYS_ID: 'userSysId'
  },

  SIDEBAR_CHATS: {
      NUMBER_OF_AVATARS: 5
  },

  hasPermission: function(userSysId, recordSysId, table) {
      if (!userSysId || !recordSysId || !table)
          return false;
      if (table == 'interaction' && this.userHasNoRoles(userSysId))
          return false;
      if (table == 'incident' || table == 'sc_request' || table == 'sc_req_item' || table == 'change_request') {
          var isRequesterIncluded = gs.getProperty('sn_sow_collab.enable_requester_in_sidebar_discussion', 'true');
          if (isRequesterIncluded == 'false' && this.userHasNoRoles(userSysId))
              return false;
      }
      return true;
  },

  userHasNoRoles: function(userSysId) {
      if (!userSysId)
          return true;
      var roleGr = new GlideRecord(this.TABLES.SYS_USER_HAS_ROLE);
      roleGr.addQuery(this.FIELDS.USER, userSysId);
      roleGr.addQuery('role.name', '!=', 'snc_internal'); // Exclude users with no role or only snc_internal role 
      roleGr.setLimit(1);
      roleGr.query();
      return !(roleGr.hasNext());
  },

  isSidebarSupportedOnSOW: function() {
      var isPolarisEnabled = gs.getProperty('glide.ui.polaris.experience', "false");
      var releaseVersion = gs.getProperty('itsm_family_release_version_check', 0);
      var isSidebarSupportedOnSOW = gs.getProperty('sn_oe_sfs.prepopulate_users_on_sidebar_modal_is_supported', "false");
      if (isSidebarSupportedOnSOW === 'true' && isPolarisEnabled === 'true' && (releaseVersion && releaseVersion >= 24))
          return true;
      return false;
  },

  getChatsForRecord: function(table, sysId, participantsLimit, chatSysId, chatsLimit) {
      if (gs.nil(table) || gs.nil(sysId)) return [];
      if (!this.isSidebarSupportedOnSOW()) return [];

      var sidebarChats = [];
      var collabRecordGr = new GlideRecord(this.TABLES.SYS_CS_COLLAB_RECORD);
      collabRecordGr.addQuery(this.FIELDS.TABLE, table);
      collabRecordGr.addQuery(this.FIELDS.DOCUMENT, sysId);
      if (!gs.nil(chatSysId))
          collabRecordGr.addQuery(this.FIELDS.COLLAB_CHAT, chatSysId);
      collabRecordGr.orderByDesc(this.FIELDS.SYS_UPDATED_ON);
      if (!gs.nil(chatsLimit))
          collabRecordGr.setLimit(chatsLimit);
      collabRecordGr.query();
      while (collabRecordGr.next()) {
          var chatGr = collabRecordGr.collab_chat ? collabRecordGr.collab_chat.getRefRecord() : null;
          if (gs.nil(chatGr) || !chatGr.isValidRecord())
              continue;
          var collabChatMembers = sn_collab.CollabChatScriptObject.getCollabChatMembers(chatGr.getValue(this.FIELDS.SYS_ID), participantsLimit);
          var participants = [];
          var moreParticipantsText = "";
          var createdByUserSysId = '';
          for (var i = 0; i < collabChatMembers.length; i++) {
              createdByUserSysId = chatGr.getValue(this.FIELDS.SYS_CREATED_BY) === collabChatMembers[i]['userName'] ? collabChatMembers[i]['userSysId'] : createdByUserSysId;
              if (i < this.SIDEBAR_CHATS.NUMBER_OF_AVATARS)
                  participants.push({
                      'userName': collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.USER_NAME],
                      'displayName': collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.DISPLAY_NAME],
                      'avatar': collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.AVATAR],
                      'email': collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.EMAIL],
                      'sysId': collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.SYS_ID]
                  });
              else
              if (!moreParticipantsText.length)
                  moreParticipantsText = collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.DISPLAY_NAME];
              else
                  moreParticipantsText += ", " + collabChatMembers[i][this.COLLAB_MEMBER_FIELDS.DISPLAY_NAME];
          }
          var moreParticipantsHtml = "";
          if (moreParticipantsText)
              moreParticipantsHtml = '<div title="' + moreParticipantsText + '">+' + this._nFormatter(parseInt(collabChatMembers.length) - 5) + "</div>";

          sidebarChats.push({
              'chatSysId': chatGr.getValue(this.FIELDS.SYS_ID),
              'type': "sidebar_discussion",
              'title': chatGr.getValue(this.FIELDS.TITLE),
              'timeAgo': this.getDuration(chatGr.getValue(this.FIELDS.SYS_UPDATED_ON)),
              'updatedOn': chatGr.getValue(this.FIELDS.SYS_UPDATED_ON),
              'createdBy': createdByUserSysId,
              'participants': participants,
              'totalParticipants': collabChatMembers.length,
              'moreParticipantsHtml': moreParticipantsHtml
          });
      }
      return sidebarChats;
  },

  getNumberOfChats: function(table, sysId) {
      var collabRecordGa = new GlideAggregate(this.TABLES.SYS_CS_COLLAB_RECORD);
      collabRecordGa.addAggregate('COUNT');
      collabRecordGa.addQuery(this.FIELDS.TABLE, table);
      collabRecordGa.addQuery(this.FIELDS.DOCUMENT, sysId);
      collabRecordGa.query();
      if (collabRecordGa.next())
          return collabRecordGa.getAggregate('COUNT');
      return 0;
  },

  getDuration: function(gdt) {
      if (!gdt)
          return '';

      var gd = new GlideDuration();
      gd.setValue(gdt);

      var currentGd = new GlideDuration();
      currentGd.setValue(new GlideDateTime());

      var difference = currentGd.subtract(gd);
      difference = difference.getDisplayValue();
      difference = difference.split(" ");
      return difference[0] + " " + difference[1];
  },

  _nFormatter: function(num) {
      if (num >= 1000000000)
          return (num / 1000000000).toFixed(1).replace(/\.0$/, '') + 'B';

      if (num >= 1000000)
          return (num / 1000000).toFixed(1).replace(/\.0$/, '') + 'M';

      if (num >= 1000)
          return (num / 1000).toFixed(1).replace(/\.0$/, '') + 'K';

      return num;
  },

  type: 'SOWSidebarChatUtilsSNC'
};

Sys ID

917e3fb753822110ad0fddeeff7b1279

Offical Documentation

Official Docs: