Scenario: There can be one or more tasks can be for a project. Here We are listing projects and It has to list the project tasks of selected project using a suitelet.
Solution:
//JJ SL Suitelet.js
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
define(['N/currentRecord', 'N/error', 'N/record', 'N/runtime', 'N/search','N/ui/serverWidget', 'N/https'],
/**
* @param{currentRecord} currentRecord
* @param{error} error
* @param{record} record
* @param{runtime} runtime
* @param{search} search
* @param{serverWidget} serverWidget
* @param{https} https
*/
(currentRecord, error, record, runtime, search, serverWidget, https) => {
/**
* Function to check whether the field has an empty value or not.
*
* @param {parameter} parameter - fieldValue
* @returns {boolean} true - if the value is not empty
* @returns {boolean} false - if the value is empty
*
* @since 2015.2
*/
function checkForParameter(parameter) {
try{
if (parameter != "" && parameter != null && parameter != undefined && parameter != "null" && parameter != "undefined" && parameter != " " && parameter != false) {
return true;
}
else {
log.debug("Empty Value found");
return false;
}
}
catch (e) {
log.debug("Error @ empty check Function: ",e.name+' : '+e.message)
}
}
function projectSearch(user){
try{
var jobSearchObj = search.create({
type: "job",
filters:
[
["isinactive","is","F"],
"AND",
["status","noneof","1"],
"AND",
[["projectmanager","anyof",user],"OR",[["jobresource","anyof","@CURRENT@"],"AND",["jobresourcerole","anyof","-2"]]]
],
columns:
[
search.createColumn({
name: "internalid",
summary: "GROUP",
label: "Internal ID"
}),
search.createColumn({
name: "entityid",
summary: "GROUP",
sort: search.Sort.ASC,
label: "Name"
})
]
});
var searchResultCount = jobSearchObj.runPaged().count;
log.debug("jobSearchObj result count",searchResultCount);
var res = []
if(searchResultCount>0) {
jobSearchObj.run().each(function (result) {
// .run().each has a limit of 4,000 results
var prjId = result.getValue({name: "internalid", summary: "GROUP"})
var prjName = result.getValue({name: "entityid", summary: "GROUP", sort: search.Sort.ASC})
res.push({
prjId: prjId,
prjName: prjName
})
return true;
});
}
return res;
}
catch (e) {
log.debug("Error @ Project Search: ",e.name+" : "+e.message)
}
}
function resourceGroupSearch() {
try{
var resourcegroupSearchObj = search.create({
type: "resourcegroup",
filters:
[
["isinactive","is","F"]
],
columns:
[
search.createColumn({
name: "internalid",
sort: search.Sort.ASC,
label: "Internal ID"
}),
search.createColumn({name: "name", label: "Name"}),
search.createColumn({name: "numberofmembers", label: "Number of members"}),
search.createColumn({
name: "subsidiary",
join: "groupMember",
label: "Subsidiary"
})
]
});
var searchResultCount = resourcegroupSearchObj.runPaged().count;
log.debug("resourcegroupSearchObj result count",searchResultCount);
var res = [];
if(searchResultCount>0) {
resourcegroupSearchObj.run().each(function (result) {
// .run().each has a limit of 4,000 results
var rgId = result.getValue({name: "internalid", sort: search.Sort.ASC})
var rgName = result.getValue({name: "name"})
var rgMembers = result.getValue({name: "numberofmembers"})
res.push({
rgId: rgId,
rgName: rgName,
rgMembers: rgMembers
})
return true;
});
}
log.debug("RG RES: ",res)
return res; }
catch (e) {
log.debug("Error @ Resource Group Search: ",e.name+" : "+e.message)
}
}
function projectTaskSearch(user){
try{
log.debug("INSIDE PRJ TSK FUNCTION")
var filterArr ;
if(checkForParameter(user)==true){
filterArr= ["project","anyof",user]
}
log.debug("filterArr: ",filterArr)
var projecttaskSearchObj = search.create({
type: "projecttask",
filters: filterArr ,
columns:
[
search.createColumn({
name: "internalid",
summary: "GROUP",
label: "Internal ID"
}),
search.createColumn({
name: "title",
summary: "GROUP",
label: "Name"
})
]
});
var searchResultCount = projecttaskSearchObj.runPaged().count;
log.debug("projecttaskSearchObj result count", searchResultCount);
var res = []
if (searchResultCount > 0) {
projecttaskSearchObj.run().each(function (result) {
// .run().each has a limit of 4,000 results
var taskId = result.getValue({
name: "internalid",
summary: "GROUP"
})
var taskName = result.getValue({
name: "title",
summary: "GROUP"
})
res.push({
taskId: taskId,
taskName: taskName
})
return true;
});
}
log.debug("Project Task RES: ", res)
return res
}
catch (e) {
log.debug("Error @ ProjectTask Search: ",e.name+" : "+e.message)
}
}
/**
* Defines the Suitelet script trigger point.
* @param {Object} scriptContext
* @param {ServerRequest} scriptContext.request - Incoming request
* @param {ServerResponse} scriptContext.response - Suitelet response
* @since 2015.2
*/
const onRequest = (scriptContext) => {
try{
var prjIdParam = scriptContext.request.parameters.prjId
log.debug("prjIdParam: ",prjIdParam)
var rgParam = scriptContext.request.parameters.resourceGroup
log.debug("rgParam: ",rgParam)
var currUser = runtime.getCurrentUser().id
var prjList = projectSearch(currUser)
log.debug("prjList: ",prjList)
var rgList = resourceGroupSearch()
log.debug("rgList: ",rgList)
var form = serverWidget.createForm({
title: 'Project'
});
form.clientScriptFileId = 179492
if(scriptContext.request.method === 'GET') {
var projectSelect = form.addField({
id: 'custpage_project',
type: serverWidget.FieldType.SELECT,
label: 'Project'
})
projectSelect.addSelectOption({
value: " ",
text: "SELECT",
isSelected: true
})
for (var i = 0; i < prjList.length; i++) {
projectSelect.addSelectOption({
value: prjList[i].prjId,
text: prjList[i].prjName,
})
}
projectSelect.isMandatory = true
projectSelect.defaultValue = prjIdParam
if (checkForParameter(prjIdParam) == true) {
var prjTaskList = projectTaskSearch(prjIdParam)
log.debug("prjTaskList: ", prjTaskList)
var sublistProjectTask = form.addSublist({
id: 'custpage_project_task_details',
type: serverWidget.SublistType.LIST,
label: 'Project Task Details'
});
var projectTask = sublistProjectTask.addField({
id: 'custpage_project_task',
type: serverWidget.FieldType.TEXT,
label: 'Project Task ID'
})
var projectTaskName = sublistProjectTask.addField({
id: 'custpage_project_taskname',
type: serverWidget.FieldType.TEXT,
label: 'Project Task'
})
//
var resourceGroup = sublistProjectTask.addField({
id: 'custpage_rg',
type: serverWidget.FieldType.SELECT,
label: 'Resource Group'
})
resourceGroup.addSelectOption({
value: "",
text: "SELECT RESOURCE GROUP"
})
for (var j = 0; j < rgList.length; j++) {
resourceGroup.addSelectOption({
value: rgList[j].rgId,
text: rgList[j].rgName
})
}
resourceGroup.defaultValue = rgParam
//
var employeeCheck = sublistProjectTask.addField({
id: 'custpage_employee_check',
type: serverWidget.FieldType.CHECKBOX,
label: 'Employee'
})
employeeCheck.defaultValue = false
var selectedResources = sublistProjectTask.addField({
id: 'custpage_selected_resources',
type: serverWidget.FieldType.TEXT,
label: 'Selected Resources'
})
// selectedResources.updateDisplayType({displayType: serverWidget.SublistDisplayType.HIDDEN})
log.debug("prjTaskList.length: ", prjTaskList.length)
if (prjTaskList.length > 0) {
for (var i = 0; i < prjTaskList.length; i++) {
sublistProjectTask.setSublistValue({
id: 'custpage_project_task',
line: i,
value: prjTaskList[i].taskId
})
sublistProjectTask.setSublistValue({
id: 'custpage_project_taskname',
line: i,
value: prjTaskList[i].taskName
})
}
}
}
scriptContext.response.writePage(form);
}
}
catch (e) {
log.debug("Error @ onRequest: ",e.name+" : "+e.message)
}
}
return {onRequest}
});
//JJ CS Validations.js
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
define(['N/currentRecord', 'N/error', 'N/https', 'N/record', 'N/runtime', 'N/search', 'N/url'],
/**
* @param{currentRecord} currentRecord
* @param{error} error
* @param{https} https
* @param{record} record
* @param{runtime} runtime
* @param{search} search
* @param{url} url
*/
function(currentRecord, error, https, record, runtime, search, url) {
/**
* Function to be executed after page is initialized.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.mode - The mode in which the record is being accessed (create, copy, or edit)
*
* @since 2015.2
*/
function pageInit(scriptContext) {
try{
console.log("Current: ",scriptContext.currentRecord)
}
catch (e) {
console.log("Error @ Page INIT: ",e.name+" : "+e.message)
}
}
/**
* Function to be executed when field is changed.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @param {string} scriptContext.sublistId - Sublist name
* @param {string} scriptContext.fieldId - Field name
* @param {number} scriptContext.lineNum - Line number. Will be undefined if not a sublist or matrix field
* @param {number} scriptContext.columnNum - Line number. Will be undefined if not a matrix field
*
* @since 2015.2
*/
function fieldChanged(scriptContext) {
try{
if (window.onbeforeunload) {
window.onbeforeunload = function () {
null;
};
}
console.log("inside field Change")
console.log("FIELD ID: ",scriptContext.fieldId)
var oldUrl = window.location.href;
console.log("OLD URL: ",oldUrl)
var r = scriptContext.currentRecord
var prjId,prjTaskId,rg,checkValue;
if(scriptContext.fieldId == 'custpage_project'){
prjId = r.getValue({
fieldId: 'custpage_project'
})
console.log("VAL: ",prjId)
oldUrl = oldUrl.split('&deploy=' + 1);
var newUrl = oldUrl[0] + "&deploy=1&prjId=" + prjId;
console.log("newUrl: ",newUrl)
window.location.href = newUrl;
}
return true;
}
catch (e) {
console.log("Error @ Field Changed: ",e.name+" : "+e.message)
}
}
/**
* Validation function to be executed when record is saved.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.currentRecord - Current form record
* @returns {boolean} Return true if record is valid
*
* @since 2015.2
*/
function saveRecord(scriptContext) {
try{
console.log("in save")
return true;
}
catch (e) {
console.log("Error @ Save Record: ",e.name+" : "+e.message)
}
}
return {
pageInit: pageInit,
fieldChanged: fieldChanged,
saveRecord: saveRecord
};
});

