Name

sn_admin_center.AdminCenterUtil

Description

No description available

Script

var AdminCenterUtil = Class.create();
AdminCenterUtil.prototype = {
  initialize: function() {

      // To Do: Generate urls using sn_ace_app_config and sn_ace_page table path values
      this.APP_URI = gs.getProperty('glide.servlet.uri') + 'now/admin-center/';
      this.REGEX_IS_TERM = /([A-Z]{2,})/;
      this.ADMIN_CENTER_READ_ONLY_ROLE_SYS_ID = 'e70c9fe5772811108d987bde5810617d';
      this.ADMIN_ROLE_SYS_ID = '2831a114c611228501d4ea6c309d626d';
  },

  _generateBreadcrumbItem: function(label, route, fields, icon) {
      return {
          label: label,
          href: 'javascript:void(0)',
          route: route,
          fields: fields,
          icon: icon
      };
  },

  getBusinessObjectiveData: function(businessObjectiveId) {
      if (!businessObjectiveId) {

          return {};
      }
      var businessObjective = new GlideRecord('sn_admin_center_business_objective');
      if (!businessObjective.get(businessObjectiveId)) {

          return {};
      }

      return {
          sys_id: businessObjectiveId,
          name: this.getBusinessObjectiveTitle(businessObjectiveId)
      };
  },

  getApplicationData: function(applicationId) {
      if (!applicationId) {

          return {};
      }
      var application = new GlideRecord('sn_admin_center_application');
      if (!application.get(applicationId)) {

          return {};
      }

      return {
          sys_id: applicationId,
          name: application.getValue('sys_name')
      };
  },

  generatePageURL: function(pagePath) {
      return encodeURI(this.APP_URI + pagePath);
  },

  generateItsmBusinessObjectivesBreadcrumbItem: function() {
      var label = gs.getMessage('All adoption blueprints');
      var route = 'adoption-blueprints';
      var fields = {};
      var icon = 'home-outline';

      return this._generateBreadcrumbItem(label, route, fields, icon);
  },

  generateBusinessObjectiveDetailsBreadcrumbItem: function(businessObjectiveId) {
      var label = this.getBusinessObjectiveData(businessObjectiveId).name || gs.getMessage('Adoption Blueprint');
      var route = 'adoption-blueprint-details';
      var fields = {
          businessObjectiveId: businessObjectiveId
      };

      return this._generateBreadcrumbItem(label, route, fields, null);
  },

  generateApplicationDetailsBreadcrumbItem: function(businessObjectiveId, applicationId) {
      var label = this.getApplicationData(applicationId).name || gs.getMessage('Application Details');
      var route = 'app-details';
      var fields = {
          applicationId: applicationId,
          businessObjectiveId: businessObjectiveId
      };

      return this._generateBreadcrumbItem(label, route, fields, null);
  },

  getBusinessObjectiveTitle: function(businessObjectiveId) {
      var businessObjectiveGr = new GlideRecord('sn_admin_center_business_objective');

      if (!businessObjectiveId || !businessObjectiveGr.get(businessObjectiveId))
          return '';

      var title = this._getTextInSentenceCase(businessObjectiveGr.getDisplayValue('name'));

      return title;
  },

  shareViaEmail: function(users, sharedContent, optionalMessage) {
      var result = {
          errors: [],
          successCount: 0,
      };
      var userGlideRecord = new GlideRecord('sys_user');
      for (var i = 0; i < users.length; i++) {
          if (!userGlideRecord.get(users[i].sys_id)) {
              gs.error('[ADMIN_CENTER] Sharing failed. Cannot find user id :' + users[i].sys_id);
              result.errors.push(gs.getMessage('Failed to share with unknown user'));
              continue;
          }

          var userName = userGlideRecord.getValue('name');
          var userEmailAddress = userGlideRecord.getValue('email');
          if (!userEmailAddress) {
              gs.error('[ADMIN_CENTER] Sharing failed. No email address for user id : ' + users[i].sys_id);
              result.errors.push(gs.getMessage('Failed to share because {0} has no email address', userName));
              continue;
          }

          if (!this._grantReadOnlyRoleToUser(users[i].sys_id)) {
              result.errors.push(gs.getMessage('Failed to share because {0} could not be granted access', userName));
              continue;
          }

          var shareError = this._shareViaEmail(userEmailAddress, userName, this.generatePageURL(sharedContent), optionalMessage, null, 'sn_admin_center.share');
          if (shareError) {
              result.errors.push(shareError);
              continue;
          }

          result.successCount++;
      }

      return result;
  },

  shareAdminHomeLandingPageFeedback: function(starRatings, optionalMessage, contactPermission) {
      var result = {
          errors: []
      };
      var shareError = this._shareViaEmail('adminexperience@servicenow.com', 'AdminX team', starRatings, optionalMessage, contactPermission, 'sn_admin_center.landing_page.feedback');
      if (shareError) result.errors.push(shareError);

      return result;
  },

  _shareViaEmail: function(userEmailAddress, userName, sharedContent, optionalMessage, contactPermission, eventName) {
      var senderInfo = this._getSenderNameAndEmail();
      if (senderInfo.error)
          return senderInfo.error;

      var emailBodyData = {
          userName: userName,
          senderName: senderInfo.senderName,
          senderEmailAddress: senderInfo.senderEmailAddress,
          sharedContent: sharedContent,
          optionalMessage: optionalMessage,
          contactPermission: contactPermission
      };
      gs.eventQueue(eventName, null, userEmailAddress, JSON.stringify(emailBodyData));

      return null;
  },

  _getSenderNameAndEmail: function() {
      var senderName = gs.getUserDisplayName();
      var senderEmailAddress = '';
      if (gs.getUserID() !== 'maint') {
          var senderGlideRecord = new GlideRecord('sys_user');

          if (!senderGlideRecord.get(gs.getUserID())) {
              gs.error('[ADMIN_CENTER] Sharing failed. Unable to find sender with user id : ' + gs.getUserID());

              return {
                  error: gs.getMessage('Failed to share using unknown sender')
              };
          }
          senderEmailAddress = senderGlideRecord.getValue('email');
          if (!senderEmailAddress) {
              gs.error('[ADMIN_CENTER] Sharing failed. No email address for sender user with id : ' + users[i].sys_id);

              return {
                  error: gs.getMessage('Failed to share because sender {0} has no email address', senderGlideRecord.getValue('name'))
              };
          }
      }

      return {
          senderName: senderName,
          senderEmailAddress: senderEmailAddress,
          error: null
      };
  },

  _grantReadOnlyRoleToUser: function(userId) {
      var userHasRoleGlideRecord = new GlideRecord('sys_user_has_role');
      userHasRoleGlideRecord.addQuery('user', userId);
      userHasRoleGlideRecord.addQuery('role', this.ADMIN_CENTER_READ_ONLY_ROLE_SYS_ID).addOrCondition('role', this.ADMIN_ROLE_SYS_ID);
      userHasRoleGlideRecord.setLimit(1);
      userHasRoleGlideRecord.query();
      if (userHasRoleGlideRecord.next()) {
          userHasRoleGlideRecord.setValue('sys_updated_on', new GlideDateTime());
          userHasRoleGlideRecord.update();
      } else {
          userHasRoleGlideRecord = new GlideRecord('sys_user_has_role');
          userHasRoleGlideRecord.setValue('user', userId);
          userHasRoleGlideRecord.setValue('role', this.ADMIN_CENTER_READ_ONLY_ROLE_SYS_ID);
          if (!userHasRoleGlideRecord.insert()) {
              gs.error('[ADMIN_CENTER] Unable to grant sn_admin_center.read_only role to user id : ' + userId);

              return false;
          }
      }

      return true;
  },

  _getTextInSentenceCase: function(text) {
      if (!text)
          return '';

      var lowerCaseTextWithTerms = this._toLowerCasePreservingTerms(text);
      return lowerCaseTextWithTerms.charAt(0).toLocaleUpperCase() + lowerCaseTextWithTerms.slice(1);
  },

  _toLowerCasePreservingTerms: function(text) {
      var _self = this;
      // a term is word that needs to be in uppercase. For example: 'AI'
      return text.split(' ').map(function(word) {
          return word.match(_self.REGEX_IS_TERM) ? word : word.toLocaleLowerCase();
      }).join(' ');
  },

  getCurrentInstanceVersion: function() {
      var currentWarFile = new SNC.UpgradeUtil().getCurrentBuild();
      return new SNC.UpgradeUtil().getReleaseFamilyName(currentWarFile);
  },

  type: 'AdminCenterUtil'
};

/* Sample Usage

var headerUtil = new AdminCenterUtil();

headerUtil.getBusinessObjectiveData('7dbeab26ff210110f416d018d53bf1dd');

headerUtil.getApplicationData('ae103b66ff210110f416d018d53bf1a6');

headerUtil.generatePageURL('adoption-blueprint-details/7dbeab26ff210110f416d018d53bf1dd');

headerUtil.generateItsmBusinessObjectivesBreadcrumbItem();
headerUtil.generateBusinessObjectiveDetailsBreadcrumbItem('7dbeab26ff210110f416d018d53bf1dd');
headerUtil.generateApplicationDetailsBreadcrumbItem('7dbeab26ff210110f416d018d53bf1dd','ae103b66ff210110f416d018d53bf1a6');
*/

Sys ID

37fcf9ceb72241109cfe23508e11a91e

Offical Documentation

Official Docs: