Friday, December 27, 2019

Most common JavaScript methods for Dynamic 365 CRM


In today's article, I will list out the most used JavaScript methods that are used in Dynamic 365 CRM. I am often being asked where to have a quick reference for learning client-side scripting in Dynamic CRM. Keeping that in my mind, I am listing few methods that one should be handy and ready with.

Note : A basic understanding of Dynamic CRM is a must to understand method and article consider only listing method with minimum description for methods.





debugger;   // The one which is favorite to all who got stuck  

// Context Methods
var UserId      = Xrm.Page.context.getUserId();
var UserName    = Xrm.Page.context.getUserName();
var orgName     = Xrm.Page.context.getOrgUniqueName();
var clientUrl   = Xrm.Page.context.getClientUrl()
var currentUserRoles = Xrm.Page.context.getUserRoles();

context.getEventArgs().preventDefault();    // Explicity preventing the save.
//NOTE: context must be passed as a function param


// Xrm.Page.data.entity Methods
var entityId       = Xrm.Page.data.entity.getId();
var entityId       = Xrm.Page.data.entity.getId().replace('{', '').replace('}', '');
var entityName     = Xrm.Page.data.entity.getEntityName();
var entitySetName  = Xrm.Page.data.entity.getEntitySetName();
var isDirty        = Xrm.Page.data.entity.getIsDirty();
var AttrName       = Xrm.Page.data.entity.getPrimaryAttributeValue();

//Lookup set: one Statement
Xrm.Page.getAttribute("uomid").setValue([{ id: "69DAC10E-96BC-4F84-8BE9-29F84FF4401C", name: "Default Unit", entityType: "uomschedule" }]); // Unit Group

// Refresh and Focus
Xrm.Page.data.refresh();
Xrm.Page.ui.refreshRibbon();


// Page Save Methods
Xrm.Page.data.entity.save(); // ** Just saves current record
Xrm.Page.data.entity.save("saveandclose") // ** Does a save and close
Xrm.Page.data.entity.save("saveandnew") // ** Save and new


// Field Events
Xrm.Page.getControl("new_fieldname").setFocus();    // Setting Focus to a Field
Xrm.Page.getAttribute("new_fieldname").setSubmitMode("always"); // Explicit Save
Xrm.Page.getAttribute('new_fieldname').fireOnChange();  // Explicity calling FireOnChange event
Xrm.Page.getControl('new_fieldname').setDisabled(true);
Xrm.Page.getAttribute("new_OptionSetName").getSelectedOption().value;   // Get Selected Value from an optionSet

Xrm.Page.getAttribute("new_myfield").setRequiredLevel("none");          // Not Required
Xrm.Page.getAttribute("new_myfield").setRequiredLevel("recommended");   // Business Recommended
Xrm.Page.getAttribute("new_myfield").setRequiredLevel("required");      // Business Required



var formType = Xrm.Page.ui.getFormType();
var formType = executionContext.getFormContext().ui.getFormType();
// Create   1
// Update   2
// ReadOnly 3


// Setting Visibility or Enabling or Disabling
Xrm.Page.ui.controls.get("new_fieldname").setVisible(false);    // Hiding a Field
Xrm.Page.ui.tabs.get("tab_unique_name").setVisible(false);      // Hiding a Tab
Xrm.Page.ui.tabs.get("tab_5").sections.get("tab_5_section_4").setVisible(false);    // Hiding a Section


// Field Level Notification
Xrm.Page.getControl("fieldname").setNotification("message");
Xrm.Page.getControl("fieldname").clearNotification();


// Form Level Notification
MSCRM.ERRORNotification = "ERROR";
MSCRM.WarningNotification = "WARNING";
MSCRM.INFONotification = "INFO";

Xrm.Page.ui.setFormNotification("message", type, unique_number);
Xrm.Page.ui.clearFormNotification(number);



// Custom Filter Query for Lookup Control
Xrm.Page.getControl('eks_accountRating').addCustomFilter('');


// Open an Entity Form
Xrm.Utility.openEntityForm('incident', Xrm.Page.data.entity.getId());


// Open a Web-Resource
var windowOptions = { height: 400, width: 400 }
Xrm.Navigation.openWebResource("new_example",windowOptions);


// Business Process Flow Methods
var activeStageName      = Xrm.Page.data.process.getActiveStage().getName();
var selectedStageName    = Xrm.Page.data.process.getSelectedStage().getName();

"Next" "Previous" = executionContext.getEventArgs().getDirection()

// Binds javascript methods on BPF events
executionContext.getFormContext().data.process.addOnStageChange(functionname)
Xrm.Page.data.process.addOnStageChange(Opportunity.Functions.ValidateSelectedStageOnSave, executionContext);
executionContext.getFormContext().data.process.addOnStageSelected(functionname)

// SubGrid events
count = Xrm.Page.getControl("ln_subgrid_quotes").getGrid().getTotalRecordCount();


// Confirm or Prompt Dialog box 
var confirmStrings = { text: "Please confirm to put Opportunity On-Hold", title: "Confirmation Dialog" };
var confirmOptions = { height: 200, width: 450 };
Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(
    function (success)
    {
        if (success.confirmed)
        {
            base.attr.setValue(executionContext, "ln_onholddate", Date.now());
            Opportunity.Functions.ReadOnly(executionContext, true);
            base.attr.unlock(executionContext, "header_statuscode");
            base.attr.unlock(executionContext, "statuscode");
            console.log("Dialog closed using OK button.");
        }
        else
        {
            base.attr.setValue(executionContext, "statuscode", 1);
            console.log("Dialog closed using Cancel button or X.");
        }
    });


// Make form Read Only

ReadOnly(executionContext, true); // will make all field ReadOnly

function ReadOnly(executionContext, flag)
{
    Xrm.Page.ui.controls.forEach(function (control, index)
    {
        if (Opportunity.Functions.doesControlHaveAttribute(control))
        {
            control.setDisabled(flag);
        }
    });
}
function doesControlHaveAttribute(control)
{
    var controlType = control.getControlType();
    return controlType != "iframe" && controlType != "webresource" && controlType != "subgrid";
}




// Few Utility JavaScript Methods

console.log("Message: " + msg + ". Error: " + ex);

console.error("Message: " + msg + ". Error: " + ex);

alert("Message: " + msg + ". Error: " + ex);


var returnBool = !isNaN(monthVariable);
var month = parseInt(monthVariable);

 
// Formatting Date
this.setDateOptions = function () {
    Date.prototype.formatMMDDYYYY = function () {
        return this.getMonth() + "/" + this.getDate() + "/" + this.getFullYear();
    }
}

// Formatting Date and Time with AM / PM 

function formatAMPM()

{

    var date = new Date();

    var hours = date.getHours();

    var minutes = date.getMinutes();

    var ampm = hours >= 12 ? 'PM' : 'AM';

    hours = hours % 12;

    hours = hours ? hours : 12; // the hour '0' should be '12'

    minutes = minutes < 10 ? '0' + minutes : minutes;

    var strTime = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear() + " " + hours + ':' + minutes + ' ' + ampm;

    return strTime;

}


// Validating Start and End Date

function ValidateMaintenanceEndDate(executionContext)

{

       var formContext = executionContext.getFormContext();

       var startDateField = formContext.getAttribute("new_maintenancestart");

       var endDateField = formContext.getAttribute("new_maintenanceend");

       var endDateFieldControl = formContext.getControl("new_maintenanceend");

       var startDate = startDateField.getValue();

       var endDate = endDateField.getValue();

 

       if (startDate != null && endDate != null)

       {

             startDate = new Date(startDate.toISOString().substr(0, 10));

             endDate = new Date(endDate.toISOString().substr(0, 10));

 

             endDateFieldControl.clearNotification("ErrEndDate");

 

             if (startDate >= endDate)

             {

                    endDateFieldControl.setNotification("cannot be before or equal to Maintenance Start.", "ErrEndDate");

             }

             else

             {

                    endDateFieldControl.clearNotification("ErrEndDate");

             }

       }

}


// Formatting Phone Number

function formatPhoneNumber(phoneNumber)

{

    if (phoneNumber.length != 10) {

        return phoneNumber;

    }

    var piece1 = phoneNumber.substring(0, 3); //123

    var piece2 = phoneNumber.substring(3, 6); //456

    var piece3 = phoneNumber.substring(6); //7890

 

    return kendo.format("({0})-{1}-{2}", piece1, piece2, piece3);

}

 


 

 

// Converting HTML content to Plain Text

function convertHtmlToPlainText(htmltext)

{

    htmltext = htmltext.replace(/<style([\s\S]*?)<\/style>/gi, '');

    htmltext = htmltext.replace(/<script([\s\S]*?)<\/script>/gi, '');

    htmltext = htmltext.replace(/<\/div>/ig, '\n');

    htmltext = htmltext.replace(/<\/li>/ig, '\n');

    htmltext = htmltext.replace(/<li>/ig, '  *  ');

    htmltext = htmltext.replace(/<\/ul>/ig, '\n');

    htmltext = htmltext.replace(/<\/p>/ig, '\n');

    htmltext = htmltext.replace(/<br\s*[\/]?>/gi, "\n");

    htmltext = htmltext.replace(/<[^>]+>/ig, '');

 

    return htmltext;

}



var temp = document.createElement("div");

temp.innerHTML = html;

return temp.textContent || temp.innerText || "";

 

myHTML.replace(/<[^>]+>/g, '');




// Comparing two Guids
function GuidsAreEqual(guid1, guid2) {
    // compares two guids
    var isEqual = false;
    if (guid1 == null || guid2 == null) {
        isEqual = false;
    } else {
        isEqual = (guid1.replace(/[{}]/g, "").toLowerCase() == guid2.replace(/[{}]/g, "").toLowerCase());
    }
    return isEqual;
}


// SET TIME OUT : Executes a function, after waiting a specified number of milliseconds.
// Syntax : setTimeout(function, milliseconds)
setTimeout(function () { Xrm.Page.ui.clearFormNotification("clearallnotification"); }, 10000);


// SET INTERVAL : repeats the execution of the function continuously.
var intervalId = setInterval(
    function () {
        if (loChildWin.closed) {
            clearInterval(intervalId);
        }
    },500);



// Encoding an URI Component
var _FilterT = "/TeamSet?$select=Name,TeamId&$filter=Name eq '" + encodeURIComponent(teamname) + "'";

Normal__URI  = "https://vicity.com/my test.asp?name=ståle&car=saab";
Encoded_URI = "https%3A%2F%2Fvicity.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab";



// Decoding a URI Component
var search = decodeURIComponent(location.search);
var params = search.substr(search.indexOf("?") + 1);
params = params.split("&");     // split param and value into individual pieces


// Converting String to a Byte Array
function packStringToByte(str) {
    var bytes = [];
    for (var i = 0; i < str.length; i++) {
        var char = str.charCodeAt(i);
        bytes.push(char >>> 8);
        bytes.push(char & 0xFF);
    }
    return bytes;
}


// Opens a Random Url
function OpenRandomUrl(url) {
    if (url != null)
        window.open(url);
    else
        alert("Page not found");
}



// Create Base64 Object
var Base64 = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", encode: function (e) { var t = ""; var n, r, i, s, o, u, a; var f = 0; e = Base64._utf8_encode(e); while (f < e.length) { n = e.charCodeAt(f++); r = e.charCodeAt(f++); i = e.charCodeAt(f++); s = n >> 2; o = (n & 3) << 4 | r >> 4; u = (r & 15) << 2 | i >> 6; a = i & 63; if (isNaN(r)) { u = a = 64 } else if (isNaN(i)) { a = 64 } t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a) } return t }, decode: function (e) { var t = ""; var n, r, i; var s, o, u, a; var f = 0; e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (f < e.length) { s = this._keyStr.indexOf(e.charAt(f++)); o = this._keyStr.indexOf(e.charAt(f++)); u = this._keyStr.indexOf(e.charAt(f++)); a = this._keyStr.indexOf(e.charAt(f++)); n = s << 2 | o >> 4; r = (o & 15) << 4 | u >> 2; i = (u & 3) << 6 | a; t = t + String.fromCharCode(n); if (u != 64) { t = t + String.fromCharCode(r) } if (a != 64) { t = t + String.fromCharCode(i) } } t = Base64._utf8_decode(t); return t }, _utf8_encode: function (e) { e = e.replace(/\r\n/g, "\n"); var t = ""; for (var n = 0; n < e.length; n++) { var r = e.charCodeAt(n); if (r < 128) { t += String.fromCharCode(r) } else if (r > 127 && r < 2048) { t += String.fromCharCode(r >> 6 | 192); t += String.fromCharCode(r & 63 | 128) } else { t += String.fromCharCode(r >> 12 | 224); t += String.fromCharCode(r >> 6 & 63 | 128); t += String.fromCharCode(r & 63 | 128) } } return t }, _utf8_decode: function (e) { var t = ""; var n = 0; var r = c1 = c2 = 0; while (n < e.length) { r = e.charCodeAt(n); if (r < 128) { t += String.fromCharCode(r); n++ } else if (r > 191 && r < 224) { c2 = e.charCodeAt(n + 1); t += String.fromCharCode((r & 31) << 6 | c2 & 63); n += 2 } else { c2 = e.charCodeAt(n + 1); c3 = e.charCodeAt(n + 2); t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63); n += 3 } } return t } }

// Encode the String                                
var EncodedString = Base64.encode(valuFromContext);

url = portNumber + "MyCustomPage/" + EncodedString;



Please let me know what the other common methods you used while scripting in Dynamic CRM.

Thanks,

Vipin Jaiswal

3 comments:

Unknown said...

really this commands are very useful. Thank you a lot

Unknown said...

Nice article 👍

Anonymous said...

Thanks for the information. Really help me a lot.