Modular Approach for Client Script

Main Script:

Script deployed to the sales order record. Our new functionalities written as modules will be added to this consolidated client script.

/**
 *@NApiVersion 2.1
 *@NScriptType ClientScript
 *@NModuleScope SameAccount
 */


define(['SuiteScripts/Jobin and Jismi IT Services/BRGC-18 Item Field Customization in Transaction Records/jj_cm_clientscript_functions_brgc34.js'],
    function (CustomClientScriptFunctions) {

        /**
         * Function to be executed after page is initialized.
         * @param {*} context 
         */
        function pageInit(context) {
            try {
                let mode = context.mode;
                console.log("ENTERED JJ CS SEACH WITH FILTER BRGC-19 - mode:", mode);
            } catch (err) {
                console.log('Err@pageInit', err);
            }
        }

        /**
          * Validation function to be executed when field is changed.
          * @param {*} context 
          * @returns 
          */
        function validateField(context) {
            try {
                CustomClientScriptFunctions.validateModuleFn(context);
                return true;
            } catch (Err) {
                console.log('Err@validateField', Err);
            }
        }

        /**
         * Validation function to be executed when sublist line is committed.
         * @param {*} context 
         * @returns 
         */
        function validateLine(context) {
            try {
                CustomClientScriptFunctions.validateLineFn(context);
                return true;
            } catch (Err) {
                console.log('Err@validateLine', Err);
            }
        }

        return {
            pageInit: pageInit,
            validateField: validateField,
            validateLine: validateLine
        };
    });

Module:


define(['N/currentRecord', 'N/url'], function (currentRecord, url) {
    const SL_SCRIPT_ID = "customscriptjj_sl_item_search_brgc20";
    const SL_DEPLOYMENT_ID = "customdeployjj_sl_item_search_brgc20";
    const SO_ITEM_TEXT_LINE = "custcol_jj_item_filter";

    /**
     * To precisely handle empty returned values, this function is used
     * @param {*} value 
     * @returns 
     */
    function isEmpty(value) {
        let isEmptyObject = function (a) {
            if (typeof a.length === 'undefined') { // it's an Object, not an Array
                let hasNonempty = Object.keys(a).some(function nonEmpty(element) {
                    return !isEmpty(a[element]);
                });
                return hasNonempty ? false : isEmptyObject(Object.keys(a));
            }
            return !a.some(function nonEmpty(element) { // check if array is really not empty as JS thinks
                return !isEmpty(element); // at least one element should be non-empty
            });
        };
        return (
            value == false
            || typeof value === 'undefined'
            || value == null
            || (typeof value === 'object' && isEmptyObject(value))
        );
    }

    /**
     * Consolidated Client script validateField() function invoke this function
     * @param {*} context 
     * @returns 
     */
    function validateModuleFn(context) {
        try {
            let sublistId = context.sublistId;
            let fieldId = context.fieldId;
            let rec = context.currentRecord;

            if (sublistId === "item" && fieldId === SO_ITEM_TEXT_LINE) {
                let itemValue = rec.getCurrentSublistValue({ sublistId: "item", fieldId: "item" });
                let itemfilterValue = rec.getCurrentSublistValue({ sublistId: "item", fieldId: SO_ITEM_TEXT_LINE });

                if (isEmpty(itemValue) && !isEmpty(itemfilterValue)) {
                    console.log("Std item Field Value", itemValue);
                    console.log("Entered itemfilterValue", itemfilterValue);

                    openItemSearchPopup(itemfilterValue);
                }
            }


            if (sublistId === "item" && fieldId === "item") {
                let itemValue = rec.getCurrentSublistValue({ sublistId: "item", fieldId: "item" });
                let itemfilterValue = rec.getCurrentSublistValue({ sublistId: "item", fieldId: SO_ITEM_TEXT_LINE });

                if (!isEmpty(itemValue) && !isEmpty(itemfilterValue)) {
                    console.log("Std item Field Value", itemValue);
                    console.log("Entered itemfilterValue", itemfilterValue);

                    rec.setCurrentSublistValue({ sublistId: 'item', fieldId: SO_ITEM_TEXT_LINE, value: "", ignoreFieldChange: true });
                }
            }
            return true;
        } catch (Err) {
            console.log('Err@validateFieldFn', Err);
        }
    }

    /**
     * Clears Item filter field value on item line commit
     * @param {*} context 
     */
    function validateLineFn(context) {
        try {
            let sublistId = context.sublistId;
            let rec = context.currentRecord;
            console.log("validateLineFn", "validateLineFn");
            if (sublistId === "item") {
                let itemValue = rec.getCurrentSublistValue({ sublistId: "item", fieldId: "item" });
                let itemfilterValue = rec.getCurrentSublistValue({ sublistId: "item", fieldId: SO_ITEM_TEXT_LINE });

                if (!isEmpty(itemValue) && !isEmpty(itemfilterValue)) {
                    console.log("Std item Field Value", itemValue);
                    console.log("Entered itemfilterValue", itemfilterValue);
                    rec.setCurrentSublistValue({ sublistId: 'item', fieldId: SO_ITEM_TEXT_LINE, value: "", ignoreFieldChange: true });
                }
            }
        } catch (error) {
            console.log('Err@validateLineFn', Err);
        }
    }

    /**
     * Open suitelet popup window
     * @param {*} itemfilterValue - value in item filter field 
     */
    function openItemSearchPopup(itemfilterValue) {
        let SCRIPT_URL = url.resolveScript({
            scriptId: SL_SCRIPT_ID,
            deploymentId: SL_DEPLOYMENT_ID,
            params: {
                itemField: itemfilterValue,
                locationField: '',
                prodField: '',
                pageId: 0
            }
        });

        window.open(SCRIPT_URL, "Choose Item", "popup=yes,toolbar=no,menubar=no,scrollbars=yes,resizable=yes,top=500,left=500,width=800,height=600");
    }

    /**
     * Set selected item in suitelet to current item line
     * @param {*} itemId - internal id of the selected item in the suitelet page
     */
    function setSlLine(itemId) {
        try {
            console.log("itemId", itemId)
            let rec = currentRecord.get();
            rec.setCurrentSublistValue({ sublistId: 'item', fieldId: 'item', value: itemId });
            let itemText = rec.getCurrentSublistText({ sublistId: 'item', fieldId: 'item' })
            if (!isEmpty(itemText)) {
                console.log("itemText", itemText)
                rec.setCurrentSublistValue({ sublistId: 'item', fieldId: SO_ITEM_TEXT_LINE, value: "", ignoreFieldChange: true });
            }
        }
        catch (Err) {
            console.log("Err@setSlLine", Err)
        }
    }

    return {
        isEmpty: isEmpty,
        openItemSearchPopup: openItemSearchPopup,
        setSlLine: setSlLine,
        validateModuleFn: validateModuleFn,
        validateLineFn: validateLineFn
    };
});

Leave a comment

Your email address will not be published. Required fields are marked *