Name

sn_sow_collab.SOWContextualPanelTeamsConfigSNC

Description

No description available

Script

var SOWContextualPanelTeamsConfigSNC = Class.create();
SOWContextualPanelTeamsConfigSNC.prototype = {

  TCM_COLLAB_FEB_VERSION: 202202,

  isTeamsPluginActive: function() {
      var tcmCollabVersion = gs.getProperty("sn_tcm_collab_hook.version");
      return (GlidePluginManager.isActive('com.snc.ms_teams.it')) && !gs.nil(tcmCollabVersion) && tcmCollabVersion >= this.TCM_COLLAB_FEB_VERSION;
  },

  getRecommendedUsers: function(recordSysId, tableName) {
      if (!this.isTeamsPluginActive() || !recordSysId || !tableName)
          return [];

      var recommendedUsersArr = [];
      var recommededUserWithPresence = [];
      var sourceGr = new GlideRecord(tableName);
      if (!sourceGr.get(recordSysId))
          return [];
      var chatUtils = new sn_tcm_collab_hook.MSTeamsChatUtil();
      var recommendedUsers = chatUtils.getRecommendedParticipants(tableName, recordSysId, '', 'microsoft_teams');
      if (!recommendedUsers || !recommendedUsers.length) // in case of no recommendations
          return [];
      recommendedUsers = chatUtils.addAvatarUrl(recommendedUsers, 'id');
      var sidebarChatUtils = new sn_sow_collab.SOWSidebarChatUtils();
      recommendedUsers.forEach(function(recommendedUser) {
          if (recommendedUser.id != gs.getUserID()) {
              if (Array.isArray(recommendedUser.users)) {
                  recommendedUser.users.forEach(function(groupUser) {
                      if (groupUser.id != gs.getUserID()) {
                          recommendedUsersArr.push({
                              id: groupUser.id,
                              fieldLabel: groupUser.fieldLabel,
                              name: groupUser.name,
                              avatar: groupUser.avatar,
                              isValidEmail: groupUser.isValidEmail,
                              email: groupUser.email,
                              title: '',
                              displayValue: groupUser.displayValue ? groupUser.displayValue : groupUser.name,
                              hasSidebarPermission: sidebarChatUtils.isSidebarSupportedOnSOW() ? sidebarChatUtils.hasPermission(groupUser.id, recordSysId, tableName) : false
                          });
                      }
                  });
              } else {
                  recommendedUsersArr.push({
                      id: recommendedUser.id,
                      fieldLabel: recommendedUser.fieldLabel,
                      name: recommendedUser.name,
                      avatar: recommendedUser.avatar,
                      isValidEmail: recommendedUser.isValidEmail,
                      email: recommendedUser.email,
                      title: '',
                      displayValue: recommendedUser.displayValue,
                      hasSidebarPermission: sidebarChatUtils.isSidebarSupportedOnSOW() ? sidebarChatUtils.hasPermission(recommendedUser.id, recordSysId, tableName) : false
                  });
              }
          }
      });

      recommededUserWithPresence = this.refreshUserPreference(recommendedUsersArr);
      return recommededUserWithPresence;
  },

  refreshUserPreference: function(recommendedParticipants) {
      if (!recommendedParticipants.length) return [];
      var presenceOutput = new sn_tcm_collab_hook.MSTeamsChatUtil().getPresence(recommendedParticipants, "id", true);
      if (!gs.nil(presenceOutput.error))
          return presenceOutput.users;
      return presenceOutput;
  },

  getChannelConfigData: function(methodName, params) {
      if (methodName === "isTokenAvailable") return this.isTokenAvailable();
      if (methodName === "fetchRefreshDuration") return GlideApplicationProperty.getValue("sn_tcm_collab_hook.teams.presence_status_cache_invalidate_duration", 180);
      return null;
  },

  getPanelDropdownPayload: function() {
      var payload = [];
      if (this.isTeamsPluginActive()) {
          var teamsChat = {
              id: 'teams-chat',
              label: gs.getMessage('Start Microsoft Teams chat'),
              icon: 'microsoft-teams-fill',
              sectionId: 'chat',
              sectionLabel: gs.getMessage('Chat')
          };
          var chatImport = {
              id: 'import-teams-chat',
              label: gs.getMessage('Import Microsoft Teams chat'),
              icon: 'download-outline',
              sectionId: 'chat',
              sectionLabel: gs.getMessage('Chat')
          };
          payload.push(teamsChat, chatImport);
      }
      return payload;
  },

  formatDate: function(dateStr, label) {
      var dateObj = {};
      var val = {};
      var startGd = new GlideDateTime(dateStr);

      dateObj["label"] = (label === "started") ? gs.getMessage("Started on") : gs.getMessage("Last Imported");
      if (label === "started") {
          val["value"] = startGd.getDisplayValue();
          val["type"] = "string";

          dateObj["value"] = val;
      } else {
          val["value"] = this.getFormattedDuration(startGd);
          val["type"] = "string";

          dateObj["value"] = val;
      }

      return dateObj;
  },

  handleChannelRedirect: function(recordSysId, tableName, requestorData) {
      var chatUtils = new sn_tcm_collab_hook.MSTeamsChatUtil();
      var res = [];

      if (!this.isTeamsPluginActive())
          return res;

      var sourceGr = this.getTableGr(recordSysId, tableName);
      var userIds = [requestorData.id, gs.getUserID()];
      var clientType = gs.getUser().getPreference('sn_tcm_collab_hook_teams_preferred_client') || 'web_client';
      var autoImport = chatUtils.importChatUtil.isAutoImportEnabled(sourceGr);

      var appDetails = chatUtils.getAppDetails();
      var useIHActionsForSingleTenant = chatUtils.useIHActionsForSingleTenant();
      if (!("multiTenant" in appDetails) && !useIHActionsForSingleTenant)
          return res;

      if (appDetails.multiTenant || useIHActionsForSingleTenant) {
          try {
              var chatInfo = new sn_tcm_collab_hook.MSTeamsChatUtil().createChatFromChatModal(sourceGr, userIds, null, null, clientType, autoImport);
              res.push(chatInfo);
              var requesterUserGr = this._getRecordById("sys_user", requestorData.id);
              new sn_tcm_collab_hook.MSTeamsAjaxUtils().addCommentForGroupChat(GlideStringUtil.escapeHTML(gs.getUserDisplayName()), GlideStringUtil.escapeHTML(requesterUserGr.getDisplayValue('name')), '[]', tableName, recordSysId, 'work_notes', chatInfo);
              return res;
          } catch (e) {
              return {
                  errorMsg: e.message
              };
          }
      }

      return res;
  },

  hasChats: function(recordSysId) {
      if (!recordSysId || !this.isTeamsPluginActive())
          return false;
      var teamsChatsGr = new GlideRecord('sn_tcm_collab_hook_ms_teams_chat');
      teamsChatsGr.addQuery('source', recordSysId);
      teamsChatsGr.setLimit(1);
      teamsChatsGr.query();
      return teamsChatsGr.hasNext();
  },

  fetchPanelCardProps: function(recordSysId, chatSysId, chatsLimit) {
      if (!this.isTeamsPluginActive())
          return [];

      var collabUtils = [];
      var itemIndex = 0;
      var teamsChatsGr = new GlideRecord('sn_tcm_collab_hook_ms_teams_chat');
      teamsChatsGr.addQuery('source', recordSysId);
      if (!gs.nil(chatSysId))
          teamsChatsGr.addQuery('sys_id', chatSysId);
      if (!gs.nil(chatsLimit))
          teamsChatsGr.setLimit(chatsLimit);
      teamsChatsGr.orderByDesc('sys_updated_on');
      teamsChatsGr.query();

      var clientType = gs.getUser().getPreference('sn_tcm_collab_hook_teams_preferred_client') || 'web_client';

      while (teamsChatsGr.next()) {
          var azureUsers = [];
          var dates = [];
          var obj = {};
          var users = teamsChatsGr.users.split(",");
          var totalParticipants = Math.floor(users.length) + '';
          obj.topic = teamsChatsGr.topic + '';
          obj.type = "microsoft_teams_chat";
          obj.updatedOn = teamsChatsGr.getValue('sys_updated_on');
          obj.createdBy = teamsChatsGr.getValue('initiated_by');
          obj.sectionLabel = gs.getMessage('Microsoft Teams chat');
          obj.commStatus = gs.getMessage('Ongoing');
          obj.sectionIcon = "microsoft-teams-fill";
          obj.participantsCount = gs.getMessage('Participants ({0})', totalParticipants);
          obj.itemIndex = itemIndex++;
          obj.chatSysId = teamsChatsGr.getUniqueValue();
          obj.sectionDropdownOptions = [{
              id: "import-teams-chat",
              label: gs.getMessage('View chat'),
              icon: "microsoft-teams-fill"
          }];

          var started = this.formatDate(teamsChatsGr.sys_created_on + '', "started");
          var imported = this.formatDate(teamsChatsGr.last_imported_on + '', "imported");

          dates.push(started, imported);

          obj.started = dates;

          users.forEach(function(user) {
              var users = {};
              var userGr = new GlideRecord('sys_user');
              userGr.get(user + '');

              users.avatar = "/" + userGr.avatar + ".iix?t=small";
              users.name = userGr.name + '';

              azureUsers.push(users);
          });
          obj.users = azureUsers;

          if (clientType == 'desktop_application')
              obj.chatUrl = new sn_tcm_collab_hook.MSTeamsChatConfigProvider().getTeamsAppUrl() + "l/conversations/" + teamsChatsGr.chat_id + "?ctx=chat";
          else
              obj.chatUrl = new sn_tcm_collab_hook.MSTeamsChatConfigProvider().getTeamsUrl() + "/_#/conversations/" + teamsChatsGr.chat_id + "?ctx=chat";

          collabUtils.push(obj);
      }

      return collabUtils;
  },


  isTokenAvailable: function() {
      if (GlidePluginManager.isActive('com.snc.tcm_collab_hook')) {
          var msTeamsCredentialsHelper = new sn_tcm_collab_hook.MSTeamsCredentialsHelper();
          return msTeamsCredentialsHelper.isAccessTokenOrRefreshTokenAvailable();
      }
      return false;
  },


  getFormattedDuration: function(dateStr) {
      if (dateStr != '') {
          var gdt = new GlideDateTime();
          gdt.setValue(dateStr);
          var dur = GlideDateTime.subtract(gdt, new GlideDateTime());
          return dur.getDisplayValue() + '';
      } else
          return '-'; // empty
  },

  getTableGr: function(recordSysId, tableName) {
      var tableGr = new GlideRecord(tableName);

      tableGr.get(recordSysId);

      return tableGr;
  },

  _getRecordById: function(table, id) {
      var gr = new GlideRecord(table);
      if (gr.get(id))
          return gr;
  },

  type: 'SOWContextualPanelTeamsConfigSNC'
};

Sys ID

c8ebb54053123010a487ddeeff7b122c

Offical Documentation

Official Docs: