Find deprecated JS code used in your Dynamics 365 environment | Dynamics 365 v9 JS Validator tool | XrmToolBox

In this point in time where all developers are busy upgrading their Dynamics 365 JavaScript libraries to use the latest supported code.

Here’s an extremely handy tool by Michel Gueli (https://twitter.com/MichelGueli) called as ‘XrmToolBox.Dynamics365V9JavascriptValidator’

Dynamics 365 v9 JavaScript Validator in XrmToolBox

If you use XrmToolBox already, make sure you look for the below tool

  1. In Tool Library, search for Dynamics 365 JavaScript Validator and you’ll find this tool already.

  2. Once you find it, it’s pretty easy to use it.
    You’ll find it in the list of your tools as below



    Then, it’ll just Retrieve all the Resources first. This will take a minute or two depending on your environment.

  3. Once done, it’s best practice to already add all the code you want to analyze in 1 solution in your Dynamics 365 environment like so

  4. Now, in the tool , open the same solution so that you only focus on the JS files you need to work with.

  5. Once you open it up, you’ll find all you files listed below. Just double click one of them and you’ll find what all needs to be changed.

  6. Once you work your way up in the file by replacing the deprecated code, you can reload the solution again and find that there are no longer any warnings like on my other file below

NuGet Gallery Link: https://www.nuget.org/packages/XrmToolBox.Dynamics365V9JavascriptValidator/

Hope this was useful!!
In case you are looking for more XrmToolBox or Dynamics 365 related posts, please check below –

  1. Set Lookups in Xrm.WebApi D365 v9 correctly. Solving ‘Undeclared Property’ error
  2. Find Created On date of solution components in Solution Layers | Dynamics 365 [Quick Tip]
  3. Pass data to HTML Web Resource using browser’s sessionStorage in Dynamics 365 CE
  4. Pass Execution Context to JS Script function as a parameter from a Ribbon button in Dynamics 365 | Ribbon Workbench
  5. Get GUID of the current View in Dynamics 365 CRM JS from ribbon button | Ribbon Workbench
  6. Import lookup referencing records together in Dynamics 365 CRM | [Linking related entity data during Excel Import]
  7. Mailbox Alerts Hide/Show behavior in Dynamics 365 CRM
  8. Enable/Disable the need to Approve Email for Mailboxes in Dynamics 365 CRM CE
  9. Debug Ribbon button customization using Command Checker in Dynamics 365 CE Unified Interface
  10. Get Dynamics 365 field metadata in a Canvas App using DataSourceInfo function | Common Data Service

Thank you!!

Pass selected rows’ GUIDs to ribbon button in D365 | Ribbon Workbench

Whenever your Ribbon button customization involves doing something to selected records, here’s the most common application that you need to take action on the selected record’s GUIDs.

Here’s how –

CRM Parameter

In Ribbon Workbench, let’s say you have a button command which is attached to a button and it calls a method ‘process’ which looks like this (it will be your method in your case)

  1. In Commands, Custom JavaScript Action will have a CRM Parameter called as SelectedControlSelectedItemIds [pretty self explanatory 😊]
    undefined


    And it’ll pass data of the selected GUIDs in my data variable passed to the method.
    undefined

Read the GUIDs

Here’s my sample code where I intend to read it from the function I used to call when user clicks on the ribbon button

  1. Now, let’s say I select a few records on the Main Sub-grid where I’ve put my button on.
    undefined

  2. Now, on clicking it, it’ll pass the three selected records’ GUIDs to the method that the button is calling. You can read it from the data parameter
    undefined
  3. You can further read from this array and use it to perform your operations.

Hope this was easy. Here are some more Ribbon Customization related posts you might want to look at –

  1. Debug Ribbon button customization using Command Checker in Dynamics 365 CE Unified Interface
  2. Show Ribbon button only on record selection in Dynamics CRM
  3. Hide Custom Ribbon Button [Easy Way] – Ribbon Workbench
  4. [SOLVED] Navigating URL from Ribbon’s custom button in Dynamics for Phones app
  5. Fix Ribbon icons on the Unified Interface in D365 CE
  6. D365 Ribbon Button shortcut to open a Document in SharePoint Online
  7. Pass data to HTML Web Resource using browser’s sessionStorage in Dynamics 365 CE

Thank you!!

Pass data to HTML Web Resource using browser’s sessionStorage in Dynamics 365 CE

If you’re using Xrm.Navigation.openWebResource(webResourceName, windowOptions, data), you probably are already using ‘data’ to the HTML Web Resource you are opening.

Here, I’m using an alternate method. I use JSON to send my data since it is widely preferred and used. Basically, I’ll Stringify my JSON object and add it to session storage, then – retrieve it from sessionStorage and Parse is back to object.

 

Opening Web Resource

Now, in my example, I’m not passing my data in the ‘data’ parameter provided by Xrm.Navigation.openWebResource(), instead I’m putting it in JSON.

  1. Let’s say, somewhere in my code, I want to send out a JSON to the HTML Web Resource which will open in a new window.
    So, instead of passing ‘data’ to Xrm.Navigation.openWebResource(), I’ll simply do the following –
    First, create a JSON object of what I want to send as data.
    Then, I’ll use sessionStorage.setItem(“<key>”, JSONObject); to add it to the sessionStorage and then open the WebResource using Xrm.Navigation.openWebResource()
    storedInSession

Reading from Session Storage

Reading from sessionStorage is as easy as putting data into it. Just the reverse –

  1. Assuming you are familiar with HTML and JS references, make sure you have correctly referenced the JS file you want to use with your HTML. Provide the name of the Web Resource in which you have your JS code.
    fileReferrenced
  2. Once the HTML document is loaded (I prefer using JQuery here to put things into document), you can read the same using sessionStorage.getItem(“<Key>”);

    And then, JSON.parse() the object retrieved from sessionStorage.
    retrived

  3. Also, if you look at the Application tab in Dev Tools of your browser, you can check for Session Storage info.
    You’ll find the Item you stored to the session
    inApplication

That way, you can use sessionStorage to keep your data in the browser session if you don’t have any other concerns or reasons not to use sessionStorage.

 

Hope this helps!!

D365 Quick Tip: Getting layoutXml from DevTools

Most times when you want to use AddCustomView() method to a Dynamics 365 control, you need to pass layoutXml to the method that will show the view you define.
fromCOde

There’s an easier trick than writing this up.

Select your View

Assuming, you have an Advanced Find view open in the window which you want as a layoutXml of, on the same, press F12 to open Dev Tools. Select the selector.
selector

And on the Advanced Find window, select Body section
andSelectBody
Click on it, and the par will be selected in the Console of the Dev Tools.

Once this is available, search for layoutXml and cycle through the results to go to the last result.
selectFromConsole

select the “value” part. That is your layoutXml. Hope this helps.

Use setFormNotification (Client side JS) in D365 v9 while Real-Time workflow is executing

Often, when a real-time workflow is being executed in the background, users don’t know how long it will take for the processing to finish. setFormNotifications in D365 v9 come handy!

Scenario

Here’s how I put my scenario –

  1. I call the Real-Time workflow using JS, example, on change of a certain field or the JS being called from the Ribbon button.
  2. The JS will trigger the Real-Time workflow I have.

Now, while the Real-time workflow is running, the user doesn’t know it has been called and should the user retry the same action? Here’s when the form notification is vital.

While the processing is happening, the message will remain as a notification on the form. Once the processing is complete, the notification will be cleared.

JS Implementation

For the JS code implementation, the function to call the workflow needs ProcessJS which is available on https://github.com/PaulNieuwelaar/

  1. So on the Form, I’ll add my file after ProcessJS file.
    formProperties
  2. Here’s the Account Form code I wrote. I created a JS file to call the Real-Time workflow.
    jsCode
  3. In the above code, the Xrm.Page.ui.setFormNotification(Message, Type of notification, Unique Identifier); This will set the notification.
  4. Page.ui.clearFormNotification(UniqueIdentifier); will clear the notification from screen.
  5. Using this, When the Process enters in Processing mode, the message is shown on screen as “Please wait while processing”
    messageShown
  6. And once the execution is finished successfully, the notification is cleared.
    wfExecuted
    notificationCleared

Similarly, you can even use this approach for WebAPI calls and have clearFormNotification set in the Success/Failure callbacks.

Hope this helps!

Accessing multiple occurrences of a field in Business Process Flow using JS in D365 CRM

While working with BPF fields using JavaScript, there can be instances where you might want to keep the field locked in a certain stage but unlocked in another stage. And using Xrm.Page.getControl(controlName) or for v9 – getFormContext.getControl(controlName) should differentiate between the 2 fields?

Let’s see what we need to do here.

Scenario

  1. Let’s say I want the users to enter Customer Need data in Develop Stage.
    unlockedField
  2. But, just view what data is present in Propose Stage shown below, not modify it. (I’ve just renamed the field to Summarize Customer Need instead)
    lockedFields

JavaScript Usage to access the Control

  1. Now, since the Summarize Customer Need field is the second time, using getFormContext.getControl(“header_process_customerneed”) will be fetched to disable the first field only i.e. Customer Need in Develop stage.
    unlockedField
  2. To access Summarize Customer Need, you need to append “_1” to the control name for the second occurrence. And _2 and so on for further occurrences.
    Here’s the sample code which I used to access Summarize Customer Need to access the second occurrence of the field and use setDisabled(true) to lock it –
    code3. And that way, you’ll be able to access Summarize Customer Need control and do your desired operation (like even make it hidden or visible depending on your scenario) –
    lockedFields
    Hope this helps!