Name

sn_skill_cfg_page.ManageSkillsExtnPtDefault

Description

Implements extension point sn_skill_cfg_page.ManageSkillsExtnPtDefault Allows customized query and sort order of users by group in the Manage Skills Configurable Page.

Script

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

  canHandle: function(params) {
      return (params.groupBy === 'department' && params.parentDepartment);
  },

  /*
   * add conditions that will result in the users to be displayed on Manage Skills page
   */
  getUsers: function(params) {
      var parentDepartment = params.parentDepartment;
      var isRecursiveDepartment = params.isRecursiveDepartment;
      var pageSize = params.pageSize;
      var pageNumber = params.pageNumber;
      let depts = [];

      var gr = new GlideRecord("sys_user");
      gr.addActiveQuery();

      if (gs.nil(parentDepartment) || !this.getDepartmentGr(parentDepartment)) {
          gs.warn("Parent department not provided");
          return {
              error: true,
              errorMessage: gs.getMessage("Could not find parent department")
          };
      }

      if (isRecursiveDepartment === true) {
          depts = this.getAllDepartments(parentDepartment, isRecursiveDepartment); // populate fAllDepartments
          gr.addQuery("department", "IN", Array.from(depts).join());
      } else {
          depts.push(parentDepartment);
          gr.addQuery("department", parentDepartment);
      }

      if (params.filter && params.filter.sys_user && params.filter.sys_user.sys_id)
          gr.addQuery('sys_id', 'IN', params.filter.sys_user.sys_id.join(','));
      if (params.filter && params.filter.sys_user && params.filter.sys_user['location.city'])
          gr.addQuery('location.city', 'IN', params.filter.sys_user['location.city'].join(','));

      if (pageSize && pageNumber != null) {
          pageSize = Number(pageSize);
          pageNumber = Number(pageNumber);
          if (pageSize > 0 && pageNumber >= 0) {
              gr.chooseWindow(pageNumber * pageSize, pageNumber * pageSize + pageSize);
          }
      }
      gr.orderBy('department');
      gr.orderBy('name');
      gr.query();

      var usersList = [];
      var grpMembers = {};
      while (gr.next()) {
          var dept = gr.getValue('department');
          if (gs.nil(grpMembers[dept]))
              grpMembers[dept] = {
                  groupName: gr.getDisplayValue('department'),
                  users: []
              };
          grpMembers[dept].users.push({
              'userID': gr.getUniqueValue(),
              'userName': gr.getValue('name') || " "
          });
          usersList.push(gr.getUniqueValue());
      }
      var totalRowCount = Object.keys(params.filter).length === 0 ? this.getDepartmentUserCount(depts) : gr.getRowCount();
      return {
          grpMembers,
          usersList,
          totalRowCount
      };
  },

  /* 
   * get list of departments, given a parent department 
   */
  getAllDepartments(parentDepartment) {
      if (gs.nil(parentDepartment)) {
          gs.warn("Parent department not provided");
      }
      this.fAllDepartments = new Map();
      var gr = this.getDepartmentGr(parentDepartment);
      if (!gr) {
          gs.warn("Parent department not found");
      }
      this.fAllDepartments.set(parentDepartment, {
          id: parentDepartment,
          label: gr.getValue('name')
      });
      this._getRecursiveDepartments(parentDepartment);
      const ar = Array.from(this.fAllDepartments);
      return ar;
  },

  /*
   * helper for getAllDepartments() when recurive option is true
   */
  _getRecursiveDepartments(parentDepartment) {
      var dep = new GlideRecord("cmn_department");
      dep.addActiveQuery();
      dep.addQuery("parent", parentDepartment);
      dep.query();
      while (dep.next()) {
          var depSysId = dep.getUniqueValue();
          if (!this.fAllDepartments.get(depSysId)) {
              this.fAllDepartments.set(depSysId, {
                  id: depSysId,
                  label: dep.getValue('name')
              });
              this._getRecursiveDepartments(depSysId);
          }
      }
  },

  getDepartmentGr: function(department) {
      var gr = new GlideRecord("cmn_department");
      if (gr.get(department))
          return gr;

      return null;
  },

  getDepartmentUserCount: function(departments) {
      var totalRowCount = 0;
      var userGA = new GlideAggregate('sys_user');
      userGA.addQuery('department', 'IN', departments.join(','));
      userGA.addQuery('active', true);
      userGA.addAggregate('COUNT');
      userGA.query();
      if (userGA.next())
          totalRowCount = userGA.getAggregate('COUNT');
      return totalRowCount;
  },

  getFilterProps: function(params) {
      let results = [];
      const parentDepartment = params.parentDepartment;
      const isRecursiveDepartment = params.isRecursiveDepartment;
      const util = new ManageSkillsUtils();
      const departmentsArr = util.getAllDepartments(parentDepartment, isRecursiveDepartment);
      userFilterEncodedQuery = 'active=true^departmentIN' + departmentsArr.join(',');

      const skillsMap = util.getSkillsByParentSkill(params.parentSkill, params.isRecursiveSkill, 1000); //Limit the number of skills shown in filter slish bucket to 1000
      const skillFilterEncodedQuery = 'active=true^sys_idIN' + Array.from(skillsMap.keys()).join(',');

      let filtersMap = {
          "Users": {
              "table": {
                  "id": "sys_user",
                  "label": "Users"
              },
              "encodedQuery": userFilterEncodedQuery,
              "field": {
                  "id": "sys_id",
                  "type": "string",
                  "label": "Sys ID"
              }
          },
          "Skills": {
              "table": {
                  "id": "cmn_skill",
                  "label": "Skills"
              },
              "field": {
                  "id": "sys_id",
                  "type": "string",
                  "label": "Sys ID"
              },
              "encodedQuery": skillFilterEncodedQuery,
          },
          "Location": {
              "table": {
                  "id": "sys_user",
                  "label": "Location"
              },
              "field": {
                  "id": "location.city",
                  "type": "string",
                  "label": "City"
              },
              "encodedQuery": userFilterEncodedQuery
          }
      };

      for (var key in filtersMap) {
          var filterProps = {
              "filterName": key,
              "dataSource": {
                  ...filtersMap[key],
                  "type": "table"

              },
              "targets": [{
                  "type": "table",
                  "table": filtersMap[key].table,
                  "field": filtersMap[key].field
              }]
          };
          results.push(filterProps);
      }

      return results;
  },

  type: 'ManageSkillsExtnPtDefault'
};

Sys ID

7e200bf9b7102110045b59fd2e11a97d

Offical Documentation

Official Docs: