Scenario: By clicking from a suitelet it need to be navigate to another Suitelet
Solution:
Every elements in the suitelet can be added by using usual suitelet form and form elements. To navigate from a suitelet to another you can use window.location.href, along with URL.
In this example, projects are listing and according to the selection of project, it lists the project tasks of selected project in the first suitelet. There is a checkbox in each line, when you check the checkbox it will navigate to the next suitelet by listing all the resources of the selected project.
//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;
}
if(scriptContext.fieldId == 'custpage_rg'){
prjId = r.getValue({
fieldId: 'custpage_project'
})
var rgCount = r.getLineCount({
sublistId: 'custpage_project_task_details'
})
console.log("RG COUNT: ",rgCount)
if(rgCount>0) {
prjTaskId = r.getCurrentSublistValue({
sublistId: 'custpage_project_task_details',
fieldId: 'custpage_project_task'
})
rg = r.getCurrentSublistValue({
sublistId: 'custpage_project_task_details',
fieldId: 'custpage_rg'
})
console.log("PRJ ID: ", prjId)
console.log("PRJ TASK: ", prjTaskId)
console.log("RG: ", rg)
}
}
if(scriptContext.fieldId == 'custpage_employee_check') {
var slUrl = 'https://3689903-sb1.app.netsuite.com//app/site/hosting/scriptlet.nl?script=783&deploy=1'
prjId = r.getValue({
fieldId: 'custpage_project'
})
var rgCount = r.getLineCount({
sublistId: 'custpage_project_task_details'
})
console.log("RG COUNT: ", rgCount)
if (rgCount > 0) {
prjTaskId = r.getCurrentSublistValue({
sublistId: 'custpage_project_task_details',
fieldId: 'custpage_project_task'
})
rg = r.getCurrentSublistValue({
sublistId: 'custpage_project_task_details',
fieldId: 'custpage_rg'
})
checkValue = r.getCurrentSublistValue({
sublistId: 'custpage_project_task_details',
fieldId: 'custpage_employee_check'
})
console.log("PRJ ID: ", prjId)
console.log("PRJ TASK: ", prjTaskId)
console.log("RG: ", rg)
console.log("checkValue: ", checkValue)
oldUrl = slUrl.split('&deploy=' + 1);
var newUrl;
newUrl = oldUrl[0] + "&deploy=1&prjId=" + prjId;
console.log("newUrl: ",newUrl)
if(checkValue==true) {
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
};
});
//JJ SL Suitelet2.js
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
define(['N/currentRecord', 'N/error', 'N/https', 'N/record', 'N/runtime', 'N/search', 'N/ui/serverWidget', 'N/url'],
/**
* @param{currentRecord} currentRecord
* @param{error} error
* @param{https} https
* @param{record} record
* @param{runtime} runtime
* @param{search} search
* @param{serverWidget} serverWidget
* @param{url} url
*/
(currentRecord, error, https, record, runtime, search, serverWidget, url) => {
function resourceSearch(resource){
try{
var jobSearchObj = search.create({
type: "job",
filters:
[
["internalid","anyof",resource],
"AND",
["isinactive","is","F"]
],
columns:
[
search.createColumn({
name: "internalid",
join: "projectResource",
label: "Resource ID"
}),
search.createColumn({
name: "entityid",
join: "projectResource",
label: "Resource Name"
}),
search.createColumn({name: "jobresourcerole", label: "Project Resource Role"})
]
});
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 resourceId = result.getValue({
name: "internalid",
join: "projectResource"
})
var resource = result.getValue({
name: "entityid",
join: "projectResource"
})
var resourceRole = result.getText({
name: "jobresourcerole"
})
res.push({
resourceId: resourceId,
resource: resource,
resourceRole: resourceRole
})
return true;
});
}
return res;
}
catch (e) {
log.debug("Errpr @ Resource 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 selectedResources = [];
var resourceList = resourceSearch(prjIdParam)
log.debug("resourceList: ",resourceList)
var form = serverWidget.createForm({
title: 'Project'
});
if(scriptContext.request.method === 'GET') {
var sublistAssignees = form.addSublist({
id: 'custpage_assignee_details',
type: serverWidget.SublistType.LIST,
label: 'Assignee Details'
});
var assigneeId = sublistAssignees.addField({
id: 'custpage_assignee_id',
type: serverWidget.FieldType.TEXT,
label: 'Assignee ID'
})
var assigneeName = sublistAssignees.addField({
id: 'custpage_assignee_name',
type: serverWidget.FieldType.TEXT,
label: 'Assignee'
})
var assigneeRole = sublistAssignees.addField({
id: 'custpage_assignee_role',
type: serverWidget.FieldType.TEXT,
label: 'Assignee Role'
})
var assigneeCheck = sublistAssignees.addField({
id: 'custpage_assignee_check',
type: serverWidget.FieldType.CHECKBOX,
label: 'Assign'
})
assigneeCheck.defaultValue = false
if(resourceList.length>0){
for(var i=0;i<resourceList.length;i++){
sublistAssignees.setSublistValue({
id: 'custpage_assignee_id',
value: resourceList[i].resourceId,
line: i
})
sublistAssignees.setSublistValue({
id: 'custpage_assignee_name',
value: resourceList[i].resource,
line: i
})
sublistAssignees.setSublistValue({
id: 'custpage_assignee_role',
value: resourceList[i].resourceRole,
line: i
})
}
}
form.addSubmitButton({
label: 'Submit'
})
// form.addButton({
// id:'custpage_btn',
// label: 'Submit',
// functionName: resourceAdd
// })
scriptContext.response.writePage(form);
}
if(scriptContext.request.method == "POST"){
var count = scriptContext.request.getLineCount({
group: 'custpage_assignee_details'
})
log.debug("COUNT: ",count)
if(count>0){
for(var i=0;i<count;i++){
var checkVal = scriptContext.request.getSublistValue({
group: 'custpage_assignee_details',
name: 'custpage_assignee_check',
line: i
});
var resId = scriptContext.request.getSublistValue({
group: 'custpage_assignee_details',
name: 'custpage_assignee_id',
line: i
});
log.debug("resId: ",resId)
log.debug("CHECKED VAL: ",checkVal)
if(checkVal == 'T'){
selectedResources.push(resId)
}
}
}
}
log.debug("selectedResources: ",selectedResources)
}
catch (e) {
log.debug("Error @ onREQUEST: ",e.name+" : "+e.message)
}
}
return {onRequest}
});



