2

Is there any way to customize the Nav Bar or the Header to have a custom link?

The use-case is that I have a JIRA issue collector that is driven by javascript. I would like the user to provide feedback from the page they are having issues. However, any solution I can come up with so far takes the user away from the current page.

Example of what I have that takes the user away:

  1. I currently have a Suitelet that is in one of the menus. That Suitelet invokes javascript but even then the user is taken away.
  2. I have a workflow on the case record that calls some Javascript Javascript in one of the UI-based action's conditions is invoked. Similar to #1 but on the case record.

I'm thinking I'm going to need to create and public a chrome extension for my company's domain just to get a pervasive bit of javascript to run for all pages...seems like a sledgehammer.

gillyspy
  • 1,578
  • 8
  • 14

1 Answers1

1

I hope someone can prove me wrong, but as far as I am aware there is no way to natively inject Javascript or anything into the NetSuite header/navbar - they don't offer customisation to the header/navbar.

I've resorted to creating a Userscript that I load through the Violent Monkey extension for Chrome or Firefox.

Example Userscript Template

// ==UserScript==
// @name        NetSuite Mods (Example)
// @namespace   Violentmonkey Scripts
// @match       *.netsuite.com/*
// @include     *.netsuite.com/*
// @grant       GM_addStyle
// @version     1.0
// @author      Kane Shaw - https://stackoverflow.com/users/4561907/kane-shaw
// @description 6/11/2020, 6:25:20 PM
// ==/UserScript==


// Get access to some commonly used NLAPI functions without having to use "unsafeWindow.nlapi..." in our code
// You can add more of these if you need access to more of the functions contained on the NetSuite page
nlapiSetFieldText = unsafeWindow.nlapiSetFieldText;
nlapiSetFieldValue = unsafeWindow.nlapiSetFieldValue;
nlapiGetFieldText = unsafeWindow.nlapiGetFieldText;
nlapiGetFieldValue = unsafeWindow.nlapiGetFieldValue;
nlapiSearchRecord = unsafeWindow.nlapiSearchRecord;
nlobjSearchFilter = unsafeWindow.nlobjSearchFilter;
nlapiLookupField = unsafeWindow.nlapiLookupField;
nlapiLoadRecord = unsafeWindow.nlapiLoadRecord;
nlapiSubmitRecord = unsafeWindow.nlapiSubmitRecord;

GM_pageTransformations = {};

/**
 * The entrypoint for our userscript
 */
function GM_main(jQuery) {

    // We want to execute these on every NetSuite page
    GM_pageTransformations.header();
    GM_pageTransformations.browsertitle();

    // Here we build a function name from the path (page being accessed on the NetSuite domain)
    var path = location.pathname;
    if(path.indexOf('.')>-1) path = path.substr(0,path.indexOf('.'));
    path = toCamelCase(path,'/');

    // Now we check if a page "GM_pageTransformations" function exists with a matching name
    if(GM_pageTransformations[path]) {
        console.log('Executing GM_pageTransformations for '+path);
        GM_pageTransformations[path]();
    } else {
        console.log('No GM_pageTransformations for '+path);
    }
}

/**
 * Changes the header on all pages
 */
GM_pageTransformations['header'] = function() {
    // For example, lets make the header background red
    GM_addStyle('#ns_header, #ns_header * { background: red !important; }');
}

/**
 * Provides useful browser/tab titles for each NetSuite page
 */
GM_pageTransformations['browsertitle'] = function() {
    var title = jQuery('.uir-page-title-secondline').text().trim();
    var title2 = jQuery('.uir-page-title-firstline').text().trim();
    var title3 = jQuery('.ns-dashboard-detail-name').text().trim();
    if(title != '') {
        document.title = title+(title2 ? ': '+title2 : '')+(title3 ? ': '+title3 : '');
    } else if(title2 != '') {
        document.title = title2+(title3 ? ': '+title3 : '');
    } else if(title3 != '') {
        document.title = title3;
    }
}

/**
 * Changes app center card pages (dashboard pages)
 */
GM_pageTransformations['appCenterCard'] = function() {
    // For example, lets make add a new heading text on all Dashboard pages
    jQuery('#ns-dashboard-page').prepend('<h1>My New Dashboard Title</h1>');
}


/**
 * Convert a given string into camelCase, or CamelCase
 * @param {String} string - The input stirng
 * @param {String} delimter - The delimiter that seperates the words in the input string (default " ")
 * @param {Boolean} capitalizeFirstWord - Wheater or not to capitalize the first word (default false)
 */
function toCamelCase(string, delimiter, capitalizeFirstWord) {
    if(!delimiter) delimiter = ' ';
    var pieces = string.split(delimiter);
    string = '';
    for (var i=0; i<pieces.length; i++) {
        if(pieces[i].length == 0) continue;
        string += pieces[i].charAt(0).toUpperCase() + pieces[i].slice(1);
    }
    if(!capitalizeFirstWord) string= string.charAt(0).toLowerCase()+string.slice(1);
    return string;
}


// ===============
// CREDIT FOR JQUERY INCLUSION CODE: Brock Adams @ https://stackoverflow.com/a/12751531/4561907
/**
 * Check if we already have a local copy of jQuery, or if we need to fetch it from a 3rd-party server
 */
if (typeof GM_info !== "undefined") {
    console.log("Running with local copy of jQuery!");
    GM_main(jQuery);
}
else {
    console.log ("fetching jQuery from some 3rd-party server.");
    add_jQuery(GM_main, "1.9.0");
}
/**
 * Add the jQuery into our page for our userscript to use
 */
function add_jQuery(callbackFn, jqVersion) {
    var jqVersion   = jqVersion || "1.9.0";
    var D           = document;
    var targ        = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    var scriptNode  = D.createElement ('script');
    scriptNode.src  = 'https://ajax.googleapis.com/ajax/libs/jquery/'
                    + jqVersion
                    + '/jquery.min.js'
                    ;
    scriptNode.addEventListener ("load", function () {
        var scriptNode          = D.createElement ("script");
        scriptNode.textContent  =
            'var gm_jQuery  = jQuery.noConflict (true);\n'
            + '(' + callbackFn.toString () + ')(gm_jQuery);'
        ;
        targ.appendChild (scriptNode);
    }, false);
    targ.appendChild (scriptNode);
}

You can copy and paste that code as-is into a new Userscript and it will do the following:

  • Make Browser tabs/windows have useful titles (shows order numbers, customer names, vendor names etc - not just "Sales Order")
  • Change the header background to red (as an example)
  • Add a new heading to the top of all "Dashboard" pages that says "My New Dashboard Title" (as an example)
Kane Shaw
  • 314
  • 1
  • 8