Name

global.PortalBoardGlideServices

Description

AJAX API for Portal Board

Script

var PortalBoardGlideServices = Class.create();
PortalBoardGlideServices.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  INVESTMENT_PORTAL_RECENT_BOARDS : "com.snc.investment.portal.recent.boards",
  INVESTMENT_PORTAL_PIN_BOARDS : "com.snc.investment.portal.pin.boards",
  json: function() {
      return new JSON();
  	
  },
  getTeamspaceData: function(teamspace) {
  	var ppmConfig = new PPMConfigHelper();
  	var pmProjectTable = ppmConfig.getProjectTables('pm_project').join();
  	var retObj={
  		'project_tables' : pmProjectTable, //To fetch all non teamspace project tables
  		'pm_project' : 'pm_project',
  		'pm_program' : 'pm_program',
  		'pm_portfolio': 'pm_portfolio',
  		'dmn_demand' : 'dmn_demand',
  		'project_user' : 'it_project_user',
  		'pm_project_task' : 'pm_project_task',
  		'teamspace'  : '' 
  	};
  	
  	if(teamspace!='') {
  		var gr=new GlideRecord('pm_app_config');
  		gr.addQuery('prefix',teamspace);
  		gr.query();
  		if(gr.next()){
  			retObj={};
  			retObj['project_tables'] = gr.getValue('pm_project_table') ? gr.getValue('pm_project_table') : 'pm_project';
  			retObj['pm_project'] = gr.getValue('pm_project_table') ? gr.getValue('pm_project_table') : 'pm_project';
  			retObj['pm_program'] = gr.getValue('pm_program_table') ? gr.getValue('pm_program_table') : 'pm_program';
  			retObj['pm_portfolio'] = gr.getValue('pm_portfolio_table') ? gr.getValue('pm_portfolio_table') : 'pm_portfolio';
  			retObj['dmn_demand'] = gr.getValue('dmn_demand_table') ? gr.getValue('dmn_demand_table') : 'dmn_demand'; 
  			retObj['project_user'] = this._isValidUserRole(teamspace+'_project_user') ? teamspace+'_project_user' : 'it_project_user';
  			retObj['pm_project_task'] = gr.getValue('pm_project_task_table') ? gr.getValue('pm_project_task_table') : 'pm_project_task';
  			retObj['teamspace'] = teamspace;
  		}
  	}
  	
  	return JSON.stringify(retObj);
  },
  getTeamspaceDataMap: function() {
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var teamspace = config['teamspace'];
  	var retObj = JSON.parse(this.getTeamspaceData(teamspace));
  	result.setAttribute("data",new JSON().encode(retObj));
  },
  getTeamspaceProject: function(projectTable){
  	var gr=new GlideRecord('pm_app_config');
  	gr.addQuery('pm_project_table',projectTable);
  	gr.query();
  	if(gr.next())
  		return gr.getValue('prefix');
  	else
  		return '';
  },
  getTeamspaceDemand: function(demandTable){
  	var gr=new GlideRecord('pm_app_config');
  	gr.addQuery('dmn_demand_table',demandTable);
  	gr.query();
  	if(gr.next())
  		return gr.getValue('prefix');
  	else
  		return '';
  },
  searchBoard: function() {
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var searchText = config['searchText'];
  	var pagetype = config['pagetype'];
  	var teamspace = config['teamspace'];
  	var from = config['from'];
  	var to = config['to'];
  	this.getAllRecords(pagetype,teamspace,from,to,searchText);
  },
  flushLRU: function(json) {
  	var cnt=999999999;
  	var prevDateTime = (new GlideDateTime()).toString();
  	var prevJson={count:cnt,last_used:prevDateTime,sys_id:''};
  	var deleteKey='';
  	for (var key in json) {
  		var curJson = json[key];
  		if((new GlideDateTime(prevJson.last_used)).compareTo(new GlideDateTime(curJson.last_used))<0){
  			deleteKey=prevJson.sys_id;
  		}
  		else
  			prevJson=curJson;
  	}
  	if(json.hasOwnProperty(deleteKey))
  		delete json[deleteKey];
  },
  deleteExcessBoards: function(boardCountProperty,boardsJson){
  	var count = Object.keys(boardsJson).length;
  	for (var i=0; i<(count-boardCountProperty); i++ ) {
  		this.flushLRU(boardsJson);
  	}
  },
  addBoardRecentCount: function(sysId,teamspace){
  	var boardCountProperty = gs.getProperty('investment_portal_no_of_recent_cards') ? gs.getProperty('investment_portal_no_of_recent_cards') : 5;
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() ){
  		var recentBoards = gs.getUser().getPreference(this.INVESTMENT_PORTAL_RECENT_BOARDS+teamspace);
  		var boardsJson = {};
  		if(JSUtil.notNil(recentBoards)) {
  			boardsJson = this.json().decode(recentBoards);
  			var count = Object.keys(boardsJson).length;
  			if(count>boardCountProperty){
  				this.deleteExcessBoards(boardCountProperty,boardsJson);
  				count = Object.keys(boardsJson).length;
  			}
  			if(boardsJson.hasOwnProperty(sysId)){
  				boardsJson[sysId].count=boardsJson[sysId].count+1;
  			}
  			else {
  				if(count>=boardCountProperty)
  					this.flushLRU(boardsJson);
  				boardsJson[sysId]={};
  				boardsJson[sysId].count=1;
  				boardsJson[sysId].sys_id=sysId;
  			}
  			boardsJson[sysId].last_used=(new GlideDateTime()).toString();
  		}
  		else {
  			boardsJson[sysId]={};
  			boardsJson[sysId].count=1;
  			boardsJson[sysId].last_used=(new GlideDateTime()).toString();
  			boardsJson[sysId].sys_id=sysId;
  		}
  		gs.getUser().setPreference(this.INVESTMENT_PORTAL_RECENT_BOARDS+teamspace,JSON.stringify(boardsJson));
  	}
  },
  pinBoard: function(){
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var sysId = config['sysId'];
  	var pagetype = config['pagetype'];
  	if(this._pinBoard(sysId) ){
  		result.setAttribute("data", new JSON().encode( {'status':0}));
  	}
  	else
  		result.setAttribute("data", new JSON().encode( {'status':1}));
  },
  _pinBoard: function(sysId){
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() ){
  		var pinList = boardGr.getValue('pinned_by');
  		var array = (pinList && pinList.split(',')) || [];
  		var i = array.indexOf(gs.getUserID());
  		if (i === -1) {
  			array.push(gs.getUserID());
  			pinList = array.join();
  			boardGr.setValue('pinned_by',pinList);
  			boardGr.update();
  		}
  		return true;
  	}
  	else
  		return false;
  },
  unPinBoard: function(){
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var sysId = config['sysId'];
  	var pagetype = config['pagetype'];
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() ){
  		this._unPinBoard(sysId, pagetype, gs.getUserID());
  		result.setAttribute("data", new JSON().encode( {'status':0}));
  	}
  	else
  		result.setAttribute("data", new JSON().encode( {'status':1}));
  },
  _unPinBoard: function(sysId, pagetype, userId){
  	if(!pagetype){
  		pagetype = 'investment';
  	}
  	if(!userId){
  		userId = gs.getUserID();
  	}
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() ){
  		var pinList = boardGr.getValue('pinned_by');
  		if(JSUtil.notNil(pinList)){
  			var array = pinList.split(',');
  			var i = array.indexOf(userId);
  			if (i !== -1) {
  				array.splice(i, 1);
  				pinList = array.join();
  				boardGr.setValue('pinned_by',pinList);
  				boardGr.update();
  			}
  		}
  	}
  },
  deleteBoard: function(){
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	
  	result.setAttribute("data", new JSON().encode(this._deleteBoard(config)));
  },
  _deleteBoard: function(config) {
  	var sysId = config['sysId'];
  	var pagetype = config['pagetype'];
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() && boardGr.canDelete()){
  		//delete members first
  		var members=new GlideRecord('planned_task_custom_console_member');
  		members.addQuery('console',sysId);
  		members.query();
  		members.deleteMultiple();
  		
  		boardGr.deleteRecord();
  		return {'status':0};
  	}
  	else
  		return {'status':1};
  },
  createBoard4mUIAction: function(){
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var boardGr = this.createBoard(config);
  	if(!boardGr)
  		return '';
  	else { 
  		var teamspace = this.getTeamspaceProject(boardGr.getValue('table'));
  		return JSON.stringify({'sysid':boardGr.getUniqueValue(),'teamspace':teamspace}) ;
  	}
  },
  isBoardExists: function(name,owner,groupType) {
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.addQuery('name',name);
  	boardGr.addQuery('owner',owner);
  	boardGr.addQuery('group_type',groupType);
  	boardGr.query();
  	if(boardGr.hasNext())
  		return true;
  	//else return false;
  },
  saveBoardDetails: function() {
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var status=0;
  	var mode = config['mode'];
  	var name = config['name'];
  	var groupType = config['pagetype'];
  	var owner=gs.getUserID();
  	
// 		if(!this.isBoardExists(name,owner,groupType)) {
// 			status=1;
// 			result.setAttribute("data", new JSON().encode( {'entity':{},'status':status,'message':'Already a board with same name exists for this owner'}));
// 			return;
// 		}
  	
  	var boardGr = new GlideRecord('planned_task_custom_console');
  	
  	if(mode=='edit')
  		boardGr = this.updateBoard(config);
  	else
  		boardGr = this.createBoard(config);
  	
  	if(!boardGr) {
  		status=1;
  		result.setAttribute("data", new JSON().encode( {'entity':{},'status':status,'message':'Error'}));
  	}
  	else {
  		var errMsgs = j2js(gs.getErrorMessages());
  		gs.flushMessages();
  		var msgs = '';
  		if(errMsgs) msgs = errMsgs;
  		result.setAttribute("data", new JSON().encode( {'entity':this.entityObject(boardGr),'status':status,'message':msgs.toString()}));
  	}
  },
  updateBoard: function(config){
  	var teamspace = config['teamspace'];
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var groupType = config['pagetype'];
  	var type = config['type'];
  	var sysId = config['sysId'];
  	var name = config['name'];
  	var prjFilter = config['prjFilter'];
  	var dmnFilter = config['dmnFilter'];
  	var rpFilter = config['rpFilter'];
  	var entity = config['entity'];
  	var includeActive = config['includeActive']?config['includeActive']:false;
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() && boardGr.canWrite()){
  		boardGr.name = name;
  		boardGr.type = type;
  		boardGr.include_active = includeActive;
  		
  		if(type=='pm_portfolio') {
  			boardGr.filter='primary_portfolio='+entity;
  			boardGr.filter2='portfolio='+entity+'^projectISEMPTY';
  			if(includeActive){
  				boardGr.filter += '^active='+includeActive;
  				boardGr.filter2 += '^active='+includeActive;
  			}
  			boardGr.entity=entity;
  		}
  		else if(type=='pm_program') {
  			boardGr.filter='primary_program='+entity;
  			boardGr.filter2='primary_program='+entity+'^projectISEMPTY';
  			if(includeActive){
  				boardGr.filter += '^active='+includeActive;
  				boardGr.filter2 += '^active='+includeActive;
  			}
  			boardGr.entity=entity;
  		}
  		else if(type == 'group_manager' || type == 'user_manager' || type == 'group' || type == 'role') {
  			boardGr.filter='sys_idIN'+entity;
  			boardGr.entity=entity;
  			boardGr.filter2 = '';
  			boardGr.table2 = '';
  		} else if(type == 'resource_plan') {
  			boardGr.filter = rpFilter;
  		}
  		else if(type=='custom') {
  			boardGr.filter=prjFilter;
  			boardGr.filter2=dmnFilter;
  		}
  		if (type == 'group_manager' || type == 'user_manager')
  			boardGr.table = 'sys_user';
  		else if (type == 'group')
  			boardGr.table = 'sys_user_group';
  		else if (type == 'role')
  			boardGr.table = 'resource_role';
  		else if (type == 'resource_plan')
  			boardGr.table = 'resource_plan';
  		else {	
  			boardGr.table  = boardGr.filter ? teamspaceDataMap['pm_project'] : '';
  			boardGr.table2 = boardGr.filter2 ? teamspaceDataMap['dmn_demand'] : '';
  		}
  		boardGr.update();
  		return boardGr;
  	}
  	else 
  		return false;
  },
  createBoard: function(config){
  	var teamspace = config['teamspace'];
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var groupType = config['pagetype'];
  	var type = config['type'];
  	var name = config['name'];
  	var sysId = config['sysId'];
  	var prjFilter = config['prjFilter'];
  	var dmnFilter = config['dmnFilter'];
  	var rpFilter = config['rpFilter'];
  	var mode = config['mode'];
  	var entity = config['entity'];
  	var table = config['table'];
  	var includeActive = config['includeActive']?config['includeActive']:false;
  	
  	
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.initialize();
  	if(!boardGr.canCreate())
  		return false;
  	if(mode=='copy'){
  		boardGr.get(sysId);
  		boardGr.pinned_by='';
  		boardGr.owner=gs.getUserID();
  		boardGr.table='';
  		boardGr.filter='';
  		boardGr.table2='';
  		boardGr.filter2='';
  	}
  	else
  		boardGr.active=true;
  	boardGr.name = name;
  	boardGr.type=type;
  	boardGr.group_type=groupType;
  	boardGr.include_active=includeActive;
  	if(type=='pm_portfolio') {
              boardGr.table=teamspaceDataMap['pm_project'];
  			boardGr.filter='primary_portfolio='+entity;
              boardGr.table2=teamspaceDataMap['dmn_demand'];
  			boardGr.filter2='portfolio='+entity+'^projectISEMPTY';
  			if(includeActive){
  				boardGr.filter += '^active='+includeActive;
  				boardGr.filter2 += '^active='+includeActive;
  			}
  			boardGr.entity=entity;
  		}
      else if(type=='pm_program') {
              boardGr.table=teamspaceDataMap['pm_project'];
  			boardGr.filter='primary_program='+entity;
              boardGr.table2=teamspaceDataMap['dmn_demand'];
  			boardGr.filter2='primary_program='+entity+'^projectISEMPTY';
  			if(includeActive){
  				boardGr.filter += '^active='+includeActive;
  				boardGr.filter2 += '^active='+includeActive;
  			}
  			boardGr.entity=entity;
  		}
       else if(type == 'group') {
  		boardGr.table='sys_user_group';
  		boardGr.filter='sys_idIN'+entity;
  		boardGr.entity=entity;
  	 } else if(type == 'role') {
  		 boardGr.table = 'resource_role';
  		 boardGr.filter = 'sys_idIN'+entity;
  		 boardGr.entity = entity;
  	 }
  	 else if(type == 'group_manager' || type == 'user_manager') {
  		boardGr.table='sys_user';
  		boardGr.filter='sys_idIN'+entity;
          boardGr.entity=entity;
       } else if(type == 'resource_plan') {
  		boardGr.table = 'resource_plan';
  		boardGr.filter = rpFilter;
  	 } else if(type=='custom') {
  		if(JSUtil.notNil(prjFilter)) {
  			if(JSUtil.notNil(table)){
  				boardGr.table=table;
  			   }
  			else{
  				boardGr.table=teamspaceDataMap['pm_project'];
  			   }
  			boardGr.filter=prjFilter;
  		}
  		if(JSUtil.notNil(dmnFilter)) {
  			boardGr.table2=teamspaceDataMap['dmn_demand'];
  			boardGr.filter2=dmnFilter;
  		}
  	}
  	
  	boardGr.insert();
  	if(groupType == 'resourceplan') {
  		var rmUsageAnalytics = new RMUsageAnalytics();
  		rmUsageAnalytics.logResourceGridAnalytics("allocationBoardCreation","","");
  	}
  	return boardGr;
  },
  	isAccessible: function(boardId) {
  	var gr = new GlideRecord('planned_task_custom_console');
  	gr.addQuery('owner', gs.getUserID());
  	gr.addQuery('sys_id',boardId);
  	gr.setLimit(1);
  	gr.query();
  	if(gr.hasNext())
  		return true;

  	var owner = gs.getUserID();

  		var ownerGroupsGr = new GlideRecord('sys_user_grmember');
  	ownerGroupsGr.addQuery('user', owner);
  	ownerGroupsGr.query();
  	var ownerGroups=[];
  	while ( ownerGroupsGr.next() )
  		ownerGroups.push(ownerGroupsGr.getValue('group'));

  	var memberConsoles = new GlideRecord('planned_task_custom_console_member');
  	memberConsoles.addEncodedQuery('user='+owner+'^ORuser_groupIN'+ownerGroups);
  	memberConsoles.addQuery('console',boardId);
  	memberConsoles.setLimit(1);
  	memberConsoles.query();

  	if(memberConsoles.hasNext())
  		return true;
  	
  	return false;
  	
  },
  _populateColors: function() {
  	var that =  this;
  	var api = new EntityColors();
  	var colors = api.entityColors();
  	this.colorMap = {};
  	colors.forEach(function(entity){
  		that.colorMap[entity.id] = entity.color;
  	});
  	this.colorMap['custom'] = '98A0EE';
  },
  
  _getColors: function(type) {
  	if(!this.colorMap.hasOwnProperty(type))
  		this._populateColors();
  	return this.colorMap[type];
  },
  
  getRecords: function() {
  var config = JSON.parse(this.getParameter('sysparm_config'));
  var type = config['type'];
  var from = config['from'];
  var searchText = config['searchText'];
  var to = config['to'];
  var pagetype = config['pagetype'];
  var teamspace = config['teamspace'];
  if(type=='pin')
  	this.getPinnedRecords(pagetype,teamspace,from,to, searchText);
  else if(type=='my')
  	this.getMyRecords(pagetype,teamspace,from,to, searchText);
  else if(type=='shared')
  	this.getSharedRecords(pagetype,teamspace,from,to, searchText);
  else if(type=='recent')
  	this.getRecentRecords(pagetype,teamspace,from,to, searchText);
  else
  	this.getAllRecords(pagetype,teamspace,from,to,'');
},
  _addQuery: function(searchText, gr, owner) {
  	if(!gs.nil(searchText)){
  		var condition = gr.addQuery('name','CONTAINS',searchText);
  		condition.addOrCondition('owner.name', 'CONTAINS',searchText);
  	}
  },
  getRecentRecords: function(pagetype,teamspace,from,to) {
  	var result = this.newItem("result");
  	var fetchedRecords = this._getRecentRecords(pagetype,teamspace,from,to);
  	result.setAttribute("data", new JSON().encode( {'records':JSON.stringify(fetchedRecords.records), 'count': Object.keys(fetchedRecords.boardsJson).length }));
  	},
  _getRecentRecords: function(pagetype,teamspace,from,to) {
  	var records = [];
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var recentBoards = gs.getUser().getPreference(this.INVESTMENT_PORTAL_RECENT_BOARDS+teamspace);
  	var boardsJson = {};
  		if(JSUtil.notNil(recentBoards)) {
  			boardsJson = this.json().decode(recentBoards);
  		}

  		var ids = [];
  		for (var key in boardsJson) {
  			var ptc= new PortalBoard(key);
  			if(ptc.isValid())
  				ids.push(key);
  			else
  				delete boardsJson[key];
  		}
  		if ( ids.length > 0 ) {
  			var console = new GlideRecord('planned_task_custom_console');
  			console.addQuery('group_type', pagetype);
  			if(pagetype=='investment'){
  				console.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  				console.chooseWindow(from,to);
  			}
  			console.addEncodedQuery('sys_idIN'+ids.join(','));
  			console.orderBy('name');
  			console.query();
  			while ( console.next() ){
  				if(this.isAccessible(console.getUniqueValue())) {
  					var eo = this.entityObject(console);
  					if(Object.keys(eo).length !== 0){
  						eo.updated_on = boardsJson[eo.sys_id].last_used;
  						eo.recent = true;
  						records.push(eo);
  					}
  				}
  				else {
  					if(boardsJson.hasOwnProperty(console.getUniqueValue())) {
  						delete boardsJson[console.getUniqueValue()];
  					}
  				}
  			}
  		}
  		gs.getUser().setPreference(this.INVESTMENT_PORTAL_RECENT_BOARDS+teamspace,JSON.stringify(boardsJson));
  		return {'boardsJson' : boardsJson, 'records' : records};
  },
  getSharedRecords: function(pagetype,teamspace,from,to, searchText) {
  	var result = this.newItem("result");
  	
  	var response = this._getSharedRecords(pagetype,teamspace,from,to, searchText);
  	
  	result.setAttribute("data", new JSON().encode( {'records':JSON.stringify(response.records), 'count': response.count }));
  },
  _getSharedRecords: function(pagetype,teamspace,from,to, searchText) {
  	var records = [];
  	var owner = gs.getUserID();
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var ownerGroupsGr = new GlideRecord('sys_user_grmember');
  	ownerGroupsGr.addQuery('user', owner);
  	ownerGroupsGr.query();
  	var ownerGroups=[];
  	while ( ownerGroupsGr.next() ){
  			ownerGroups.push(ownerGroupsGr.getValue('group'));
  	}
  	var memberConsoles = new GlideRecord('planned_task_custom_console_member');
  	memberConsoles.addEncodedQuery('user='+owner+'^ORuser_groupIN'+ownerGroups);
  	memberConsoles.query();
  	var ids = [];
  	
  	while ( memberConsoles.next() ){
  		ids.push(memberConsoles.getValue('console'));
  	}
  	var cnt2 = 0;
  	if ( ids.length > 0 ) {
  		var console = new GlideRecord('planned_task_custom_console');
  		console.addQuery('group_type', pagetype);
  		if(pagetype=='investment'){
  			console.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  			console.chooseWindow(from,to);
  		}
  		this._addQuery(searchText, console, owner);
  		console.addEncodedQuery('sys_idIN'+ids.join(','));
  		console.orderBy('name');
  		console.query();
  		cnt2=console.getRowCount();
  		while ( console.next() )
  			if(this.isAccessible(console.getUniqueValue())){
  			var board = this.entityObject(console);
  			if(Object.keys(board).length !== 0){
  				records.push(board);
  			}
  		}
  	}
  	
  	return {'records': records, 'count': (records.length>0 ? cnt2 : 0)};
  },
  getPinnedRecords: function(pagetype,teamspace,from,to, searchText) {
  	var result = this.newItem("result");
  	var fetchedRecord = this._getPinnedRecords(pagetype,teamspace,from,to, searchText);

  	result.setAttribute("data", new JSON().encode( {'records':JSON.stringify(fetchedRecord.records), 'count': fetchedRecord.count}));
  },
  _getPinnedRecords: function(pagetype,teamspace,from,to, searchText) {
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var owner = gs.getUserID();
  	var gr = new GlideRecord('planned_task_custom_console');
  	gr.addQuery('group_type', pagetype);
  	if(pagetype=='investment'){
  		gr.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  	}
  	if(pagetype=='investment')
  		gr.chooseWindow(from,to);
  	gr.addQuery('pinned_by','CONTAINS', owner);
  	this._addQuery(searchText, gr, owner);
  	//gr.addQuery('owner', owner);
  	gr.query();
  	var records = [];

  	while ( gr.next() ) {
  		if(this.isAccessible(gr.getUniqueValue())){
  			var board = this.entityObject(gr);
  			if(Object.keys(board).length !== 0){
  				records.push(board);
  			}
  		}
  	}
  	return {'records' : records, 'count': records.length>0 ? gr.getRowCount() : 0};
  },
  getMyRecords: function(pagetype,teamspace,from,to, searchText) {
  	var result = this.newItem("result");
  	
  	var response = this._getMyRecords(pagetype,teamspace,from,to, searchText);

  	result.setAttribute("data", new JSON().encode( {'records':JSON.stringify(response.records), 'count': response.count}));
  },
  _getMyRecords: function(pagetype,teamspace,from,to, searchText) {
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var owner = gs.getUserID();
  	var gr = new GlideRecord('planned_task_custom_console');
  	gr.addQuery('group_type', pagetype);
  	if(pagetype=='investment'){
  		gr.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  		gr.chooseWindow(from,to);
  	}
  	gr.addQuery('owner', owner);
  	this._addQuery(searchText, gr, owner);
  	
  	gr.query();
  	var records = [];
  	while ( gr.next() ){
  		if(this.isAccessible(gr.getUniqueValue())){
  			var board = this.entityObject(gr);
  			if(Object.keys(board).length !== 0){
  				records.push(board);
  			}
  		}
  	}

  	return {'records': records, 'count': (records.length>0 ? gr.getRowCount() : 0)};
  },
  getTypes: function() {
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var pageType = config['pagetype'];
  	
  	var gr = new GlideRecord('planned_task_custom_console')
  	var validChoices = gr.getElement('type').getChoices(pageType);
  	var results = [];
  	var choicesList = GlideChoiceList.getChoiceList('planned_task_custom_console', 'type');
  	
  	for(var i=0;i<choicesList.size();i++)
  		if(validChoices.indexOf(choicesList.get(i).value) !== -1 )
  			results.push({value :choicesList.get(i).value, name: choicesList.get(i).label});
  	
  	result.setAttribute("data", new JSON().encode( {'records':JSON.stringify(results)}));

  },
  getAllRecords: function(pagetype,teamspace,from,to,searchText) {
  	var result = this.newItem("result");
  	
  	var response = this._getAllRecords(pagetype,teamspace,from,to,searchText);
  	
  	result.setAttribute("data", new JSON().encode( {'records':JSON.stringify(response.records), 'count': response.totalCount}));

  },
  _getAllRecords: function(pagetype,teamspace,from,to,searchText) {
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var owner = gs.getUserID();
  	var gr = new GlideRecord('planned_task_custom_console');
  	if(pagetype=='investment'){
  		gr.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  	}
  	gr.addQuery('owner', owner);
  	if(searchText != ''){
  		gr.addQuery('name','CONTAINS',searchText);
  		gr.addOrCondition('owner.name', 'CONTAINS',searchText);
  	}
  	gr.addQuery('group_type', pagetype);
  	if(pagetype=='investment')
  		gr.chooseWindow(from,to);
  	gr.query();
  	var records = [];
  	while ( gr.next() ){
  		if(this.isAccessible(gr.getUniqueValue())){
  			var board = this.entityObject(gr);
  			if(Object.keys(board).length !== 0){
  				records.push(board);
  			}
  		}
  	}
  	
  	var ownerGroupsGr = new GlideRecord('sys_user_grmember');
  	ownerGroupsGr.addQuery('user', owner);
  	ownerGroupsGr.query();
  	var ownerGroups=[];
  	while ( ownerGroupsGr.next() ){
  			ownerGroups.push(ownerGroupsGr.getValue('group'));
  	}
  	var memberConsoles = new GlideRecord('planned_task_custom_console_member');
  	memberConsoles.addEncodedQuery('user='+owner+'^ORuser_groupIN'+ownerGroups);
  	memberConsoles.query();
  	var ids = [];
  	if(to>records.length)
  		while ( memberConsoles.next() )
  			ids.push(memberConsoles.getValue('console'));
  	var cnt2 = 0;
  	if ( ids.length > 0 ) {
  		var console = new GlideRecord('planned_task_custom_console');
  		console.addQuery('group_type', pagetype);
  		if(pagetype=='investment'){
  			console.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  		}
  		console.addEncodedQuery('sys_idIN'+ids.join(','));
  		if(searchText!='') {
  			console.addEncodedQuery('nameLIKE'+searchText+'^ORowner.nameLIKE'+searchText);
  		}
  		console.orderBy('name');
  		console.query();
  		cnt2=console.getRowCount();
  		while ( console.next() && (to-records.length)>=0){
  			var board = this.entityObject(console);
  			if(Object.keys(board).length !== 0){
  				records.push(board);
  			}
  		}
  	}
  	
  	return {'records': records, 'totalCount': gr.getRowCount() + cnt2};

  },
  addMember: function(consoleId,userId){
  	var ptc = new PortalBoard(consoleId);
  	if(!ptc.memberExists(userId))
  		ptc.addMember(userId);
  	return this.getMembersInfo([userId]);
  },
  removeMember: function(consoleId,userId){
  	var ptc = new PortalBoard(consoleId);
  	if(ptc.memberExists(userId))
  		ptc.removeMember(userId);
  	//if bookmarked, remove it
  	this._unPinBoard(consoleId, 'investment', userId);
  	return [{'id':userId}];
  },
  addGroup: function(consoleId,groupId){
  	var ptc = new PortalBoard(consoleId);
  	if(!ptc.groupExists(groupId)){
  		ptc.addGroup(groupId);
  	}
  	return this.getGroupsInfo([groupId]);
  },
  removeGroup: function(consoleId,groupId){
  	var ptc = new PortalBoard(consoleId);
  	if(ptc.groupExists(groupId))
  		ptc.removeGroup(groupId);
  	return [{'id':groupId}];
  },
  saveShareDetails: function() {
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var sysId = config['sysId'];
  	var entityId = config['entityId'];
  	var type = config['type'];
  	var pagetype = config['pagetype'];
  	var action = config['action'];
  	var entityInfo = {};
  	
  	if(action=='share')
  		if(type=='user')
  			entityInfo = this.addMember(sysId,entityId);
  		else
  			entityInfo = this.addGroup(sysId,entityId);
  	else
  		if(type=='user')
  			entityInfo = this.removeMember(sysId,entityId);
  		else
  			entityInfo = this.removeGroup(sysId,entityId);
  	
  	result.setAttribute("data", new JSON().encode( {'status':0, 'profile':entityInfo[0]}));
  },
  
  getBoardWidgets: function() {
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var sysId = config['sysId'];
  	var ids = config['ids']
  	var widgets = new PortalBoard().getPortalBoardWidgets(sysId, ids);
  	result.setAttribute("data", new JSON().encode({
  		widgets: widgets
  	}));
  },

  getBoardWidgetDetails: function(consoleId) {
      var ptc = new PortalBoard(consoleId);
      var widgets = ptc.getBoardWidgetDetails();
      return widgets;
  },
  getMembersInfo: function(memberIds) {
      var profiles = new PPMUserProfiles();
      var mems = profiles.getProfiles(memberIds);
  	for(var i = 0;i<mems.length;i++){
  		if(mems[i].imgUrl) mems[i].imgUrl += '?t=small';
  	}
      return mems;
  },
  getGroupsInfo: function(groupIds) {
      var profiles = new PPMUserProfiles();
      var grps = profiles.getGroupProfiles(groupIds);
  	for(var i = 0;i<grps.length;i++){
  		if(grps[i].imgUrl)grps[i].imgUrl += '?t=small';
  	}
      return grps;
  },
  getEntityName: function(type, entityId) {
  	if(JSUtil.has(type) && (type != 'custom')){
  		var gr;
  		if(type === 'group') {
  			gr = new GlideRecord('sys_user_group');
  		} else if(type === 'role') {
  			gr = new GlideRecord('resource_role');
  		}else if(type === 'group_manager' || type === 'user_manager') {
  			gr = new GlideRecord('sys_user');
  		} else {
  			gr=new GlideRecord(type);
  		}
  		gr.get(entityId);
  		return gr.getDisplayValue();
  	}
  	else 
  		return '';
  },
  
  _isValidUserRole: function(roleName) {
  	var gr = new GlideRecord('sys_user_role');
  	gr.addQuery('name',roleName);
  	gr.query();
  	if(gr.next())
  		return true;
  	return false;	
  },
  
  _isRecent: function (sysId,teamspace){
  	var recentBoards = gs.getUser().getPreference(this.INVESTMENT_PORTAL_RECENT_BOARDS+teamspace);
  	var boardsJson = {};
  	if(JSUtil.notNil(recentBoards)) {
  		boardsJson = this.json().decode(recentBoards);
  		if(boardsJson.hasOwnProperty(sysId))
  			return true;
  	}
  },
  entityObject: function(gr) {
  	var entity = {};
  	try{
  		//var entityColors = new EntityColors();
  		//var color = entityColors.entityColor(gr.getValue('table'));
  		var projRecCount = 0;
  		var teamspace = '';
  		if(JSUtil.notNil(gr.getValue('table'))) {
  			var projRecs = new GlideAggregate(gr.getValue('table'));
  			projRecs.addEncodedQuery(gr.getValue('filter'));
  			projRecs.addAggregate('COUNT');
  			projRecs.query();
  			if ( projRecs.next() )
  				projRecCount =projRecs.getAggregate('COUNT');
  			teamspace = this.getTeamspaceProject(gr.getValue('table'));
  		}

  		var demRecCount = 0;
  		if(JSUtil.notNil(gr.getValue('table2'))) {
  			var demRecs = new GlideAggregate(gr.getValue('table2'));
  			demRecs.addEncodedQuery(gr.getValue('filter2'));
  			demRecs.addAggregate('COUNT');
  			demRecs.query();
  			if ( demRecs.next() )
  				demRecCount =demRecs.getAggregate('COUNT');
  			teamspace = this.getTeamspaceDemand(gr.getValue('table2'));
  		}

  		var memberIds = [];
  		var ptc = new PortalBoard(gr.getValue('sys_id'));

  		var isPinned = ptc.isPinnedByUser(gs.getUserID());

  		var canEdit = false;
  		if (gr.getValue('owner') == gs.getUserID()){
  			canEdit = true;
  		}

  		var members = ptc.members();
  		while ( members.next() ) {
  			memberIds.push(members.getValue('user'));
  		}
  		var memberInfo = this.getMembersInfo(memberIds);

  		var groupIds = [];
  		var groups = ptc.groups();
  		while ( groups.next() ) {
  			groupIds.push(groups.getValue('user_group'));
  		}
  		var groupInfo = this.getGroupsInfo(groupIds);

  		var allSharedInfo = [];
  		for(var i=0;i<memberInfo.length;i++){
  			allSharedInfo.push(memberInfo[i]);
  		}
  		for(var i=0;i<groupInfo.length;i++){
  			allSharedInfo.push(groupInfo[i]);
  		}
  		var ownerId = [];
  		ownerId.push(gr.getValue('owner'));
  		var ownerInfo = this.getMembersInfo(ownerId);
  		
  		var type = gr.getValue('type') ? gr.getValue('type') : "";
  		var name = gr.getValue('name') ? gr.getValue('name') : "";
  		var groupType = gr.getValue('group_type') ? gr.getValue('group_type') : "";
  		var entityValue = gr.getValue('entity') ? gr.getValue('entity') : "";
  		var widgetsInfo = [];
  		if(groupType=='investment' || groupType=='')
  			widgetsInfo = this.getBoardWidgetDetails(gr.getValue('sys_id'));
  		
  		var that = this;
  		entity = {
  			sys_id: gr.getValue('sys_id'),
  			groupType:  groupType,
  			type:  type,
  			typeDisplayValue: gr.getDisplayValue('type'),
  			color: that._getColors(type),
  			name: name,
  			description: gr.getDisplayValue('filter')+'; '+gr.getDisplayValue('filter2'),
  			filter: gr.getValue('filter'),
  			filterDisplayValue: gr.getDisplayValue('filter'),
  			includeActive: gr.getValue('include_active') == '1' ? true : false,
  			filter2: gr.getValue('filter2'),
  			filter2DisplayValue: gr.getDisplayValue('filter2'),
  			short_description: gr.getValue('short_description'),
  			projects: projRecCount,
  			demands: demRecCount,
  			allShared: allSharedInfo,
  			sharedWith: memberInfo,
  			sharedWithGroup: groupInfo,
  			sharedWithMe: !canEdit,
  			owned_by_id: gr.getValue('owner'),
  			owner: ownerInfo[0],
  			widgets: widgetsInfo,
  			pinned: isPinned,
  			canEdit: canEdit,
  			recent: this._isRecent(gr.getValue('sys_id'),teamspace),
  			entity: {displayValue:this.getEntityName(gr.getValue('type'),gr.getValue('entity')), value: entityValue},
  			updated_on : gr.getDisplayValue('sys_updated_on'),
  			entities : ptc.getEntities(),
  			isOwner : ( ptc.owner() === gs.getUserID()) || gs.hasRole('admin'),
  			preferences : ptc.getPreferences(),
  			hasShared : ptc.hasShared()
  			//over_limit : parseInt(recCount) > parseInt(gr.getValue('record_limit')) ? true: false
  		};
  		
  	}catch(e){
  		gs.error("PortalBoardGlideServices:entityObject :"+JSON.stringify(e));
  	}
      return entity;
  },
  updateBoardDates: function(config){
  	var sysId = config['sysId'];
  	var startDate = config['startDate'];
  	var endDate = config['endDate'];
  	var boardGr=new GlideRecord('planned_task_custom_console');
  	boardGr.get(sysId);
  	if(boardGr.isValid() && boardGr.canWrite()){
  		boardGr.start_date = startDate;
  		boardGr.end_date = endDate;
  		boardGr.update();
  	}
  	return boardGr;
  },
  getITProjectUsers: function (){
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var teamspace = config['teamspace'];
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var hasRoleGr = new GlideRecord('sys_user_has_role');
  	hasRoleGr.addQuery('role.name',teamspaceDataMap['project_user']);
  	hasRoleGr.query();
  	var users=[];
  	while(hasRoleGr.next()) {
  		var user={};
  		user['displayValue'] = hasRoleGr.getDisplayValue('user');
  		user['value'] = hasRoleGr.getValue('user');
  		users.push(user);
  	}
  	result.setAttribute("data", new JSON().encode( {'users':users}));
  },
  getITProjectGroups: function (){
  	var result = this.newItem("result");
  	var config = JSON.parse(this.getParameter('sysparm_config'));
  	var teamspace = config['teamspace'];
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	var hasRoleGr = new GlideRecord('sys_group_has_role');
  	hasRoleGr.addQuery('role.name',teamspaceDataMap['project_user']);
  	hasRoleGr.query();
  	var groups=[];
  	while(hasRoleGr.next()) {
  		var user={};
  		user['displayValue'] = hasRoleGr.getDisplayValue('group');
  		user['value'] = hasRoleGr.getValue('group');
  		groups.push(user);
  	}
  	result.setAttribute("data", new JSON().encode( {'groups':groups}));
  },

  getAllPortalBoards: function(){
  	var result = this.newItem("result");
  	
  	var config = {};
  	if(JSUtil.notNil(this.getParameter('sysparm_config')))
  		config = JSON.parse(this.getParameter('sysparm_config'));
  	var groupType = config['pagetype'] ? config['pagetype'] : 'investment';
  	var teamspace = config['teamspace'] ? config['teamspace'] : '';
  	var teamspaceDataMap = JSON.parse(this.getTeamspaceData(teamspace));
  	try{
  		var owner = gs.getUserID();
  		var gr = new GlideRecord('planned_task_custom_console');
  		gr.addQuery('owner', owner);
  		gr.addQuery('group_type',groupType);
  		if(groupType=='investment'){
  			gr.addEncodedQuery('tableIN'+teamspaceDataMap['project_tables']+'^ORtable2='+teamspaceDataMap['dmn_demand']);
  		}
  		gr.orderBy('name');
  		gr.query();
  		var records = [];
  		while (gr.next()){
  			records.push({
  				sys_id : gr.getUniqueValue(),
  				name: gr.getValue('name')
  			});
  		}

  		var ownerGroupsGr = new GlideRecord('sys_user_grmember');
  		ownerGroupsGr.addQuery('user', owner);
  		ownerGroupsGr.query();
  		var ownerGroups=[];
  		while (ownerGroupsGr.next()){
              ownerGroups.push(ownerGroupsGr.getValue('group'));
          }
  		var memberConsoles = new GlideAggregate('planned_task_custom_console_member');
  		memberConsoles.addEncodedQuery('user='+owner+'^ORuser_groupIN'+ownerGroups);
  		if(groupType=='investment'){
  			memberConsoles.addEncodedQuery('console.table='+teamspaceDataMap['pm_project']+'^ORconsole.table2='+teamspaceDataMap['dmn_demand']);
  		}
  		memberConsoles.groupBy('console');
  		memberConsoles.query();
  		while (memberConsoles.next()){
              records.push({
                  sys_id : memberConsoles.getValue('console'),
                  name: memberConsoles.getDisplayValue('console')
              });
  		}
  		result.setAttribute("data",  new JSON().encode({"allBoards":records, "error":''}));
  	}catch(e){
  		gs.log(JSON.stringify(e));
  		result.setAttribute("data",  new JSON().encode({"allBoards":[], "error":JSON.stringify(e)}));
  	}
  	
  },
  getBoardDetails: function(){
  	var result = this.newItem("result");
  	try{
  		var config = JSON.parse(this.getParameter('sysparm_config'));
  		var sysId = config['sysId'];
  		var gr = new GlideRecordSecure('planned_task_custom_console');
  		gr.get(sysId);
  		var board = this.entityObject(gr);
  		result.setAttribute("data",  new JSON().encode({"board":board, "error":''}));
  	}catch(e){
  		result.setAttribute("data",  new JSON().encode({"board":{}, "error":JSON.stringify(e)}));
  	}
  	
  },
  
  getConsoleConfig: function() {
  	var result = this.newItem("result");
  	try {
  		var sysClassName = this.getParameter('sysparm_sys_class_name') || "pm_portfolio";
  		var context = this.getParameter('sysparm_context') || "Investment Portal";
  		var api = new SNC.PlannedTaskAPI();
  		var config = api.gridEntityMetadata(sysClassName, context);
  		result.setAttribute('status', 'success');
  		result.setAttribute('data', JSON.stringify(config));
  	} catch(e) {
  		result.setAttribute('status', 'error');
  	}
  },
  
  saveBoardPreferences: function() {
  	var result = this.newItem("result");
  	try {
  		var sysId = this.getParameter('sysparm_sys_id');
  		var preferencesObj = JSON.parse(this.getParameter('sysparm_preferences'));
  		PortalBoardFactory.savePreferences(sysId, preferencesObj);
  	} catch(e) {
  		result.setAttribute('status', 'error');
  	}
  	result.setAttribute('status', 'success');
  },
  
  type: 'PortalBoardGlideServices'
});

Sys ID

47f5a2575f13030056976e303e46660d

Offical Documentation

Official Docs: