A Bit of Background

I have been working with Dynamics CRM/365 (now the Power Platform) since 2005 and have written a tens of thousands of lines of JavaScript over the years and shared countless blog articles as I found tips and techniques for using JavaScript in the product. Here is my first blog post, on how to hide a tab in CRM 3.0.

I obtained my Microsoft Certified Training certification in order to teach what I learned to others.  I started out using the Microsoft-supplied materials but I wasn't satisfied with their depth - so I created my own, which is what you see here.

Why This Course is for YOU!

As you review the contents of this page, please keep the following in mind:

  • I have a lot of experience with the Dynamics platform

  • I have done everything there is to do with Business Rules but need more

  • I am good enough, smart enough, and you know what? People like me

  • I am ready to take our user interface experience to the next level, and only JavaScript can help me

  • It is resume update season and I need a gift

I Learn, You Learn

The Microsoft Power Platform is maturing at an astounding rate - with changes happening on a weekly, if not daily basis.

This can make things extremely difficult to keep up with.

I am committed to sharing what I learn as I learn it.

My processional mantra: A rising tide raises all boats, has never been more true.

Want to come along for the ride?

Unlimited Updates

This course is evergreen and always changing and adapting to new additions and changes that the Microsoft Power Platform product team throws at us. This means I will constantly be adding new tools, techniques, and tutorials as we move forward into the future.

Even today, as I launch the third-iteration of this course, I am actively adding new comment that I have worked out within the past two months. LOTS of fun stuff is coming!

Why This Course?

Power Platform JavaScript development can be complex but it doesn't have to be daunting. Based on years of experience teaching JavaScript development, I have created a curriculum that takes a lot of the pain out of the equation.

Let’s take a look at what this course has to offer:

Small, Bite-Sized Chunks

Each module is broken into a lessons consisting of articles, presentations, and exercises to help you learn a specific part of the Model-Driven apps Client API. 

Do I need to complete the lessons in order?

No, you may complete them in any order that you wish.

However, based on teaching JavaScript development courses like this for years, I have put the information in order that I feel would be most advantageous for you to learn.

Lifetime Access

This is a one-time investment. You get unlimited use of all of the content,  sample code, and tutorials, for as long as you want.

Real-World Examples

Where possible, I try to include real-world samples from actual projects that I have worked on (or am working on).

Again: The goal is to jump-start your ability to utilize JavaScript in a Model-Driven Power Platform application to add functionality not usually 

Course Completion Certificate

Upon the completion of this course, you will receive a certificate stating  that you are a Power Platform JavaScript developer. We can even post that to LinkedIn, if you wish!

Start Now!

Are you ready?
Of course you are.
Click the button below to get started!

Course curriculum

  • 1

    Community Discussions

    • NEW!! JavaScript Development Community

  • 2

    Before We Begin

    • Announcements

    • About This Course

    • JavaScript Development Training Roadmap

    • A Note About Versions

    • An Introduction to JavaScript

    • JavaScript or Business Rules?

    • Business Rules Review (encore Free Webinar Friday presentation)

    • Revision History

  • 3

    Getting Started

    • Assemble Your Toolbox

    • Install the Sample Entity Solution

    • Creating a New Visual Studio Solution

    • Setting up your Development Environment

    • The Problem with Browser Caching

    • The reality of working with two versions of the Dynamics 365 web interface

    • Solution to Why is the form editor not working correctly?

    • New Form Editor or Classic Form Editor?

    • Reloading Pages in Google Chrome and New Edge Browser

  • 4

    Dynamics 365 JavaScript Object Model

    • Dynamics 365 Object Model (v8.2)

    • Dynamics 365 CE Object Model (v9.x)

    • Common Object Model Methods

    • Understanding Form Field Attributes and Controls

  • 5

    Differences in the Dynamics 365 CE v9 Object Model

    • Working with the v9 Object Model

    • Introduction to the Execution Context object

    • Using the executionContext.getFormContext Method

  • 6

    Creating a JavaScript Namespace Framework

    • Show Me How: Creating your own object model

  • 7

    JavaScript Form Libraries and Event Handlers

    • JavaScript Web Resource Basics

    • Show Me How: Create Your First JavaScript Library

    • Note on Event Handlers

    • Working with the OnLoad, OnSave, and OnChange Event Handlers

    • A quick tour of the Form Library Event Handlers

    • TIP: Removing All JavaScript from a Form

    • Test Your Knowledge

  • 8

    User Interface Design Elements

    • Webinar Replay: Introduction to Customizations

    • Webinar Replay: The Art and Science of Model-Driven App Design

    • Webinar Replay: Eliminating Technical Debt

    • Webinar Replay: Join the PCF Revolution

  • 9

    Working with Data

    • JavaScript code for this lesson

    • Working with Data Methods

    • Getting and Setting Field Values

    • Exercise: Getting and Setting Field Values

    • Show Me How: Getting and Setting Field Values (from Visual Studio)

    • Setting the field requirement level

    • Exercise: Setting the Field Requirement Level

    • Show Me How: Setting the Field Requirement Level

    • Using the setSubmitMode Method

    • getAttributeType and getFormat methods

    • Test Your Knowledge

    • Additional Data Methods

    • Finding: Hidden field still required

  • 10

    Working with Controls

    • Source Code for this Lesson

    • Introduction

    • L1: Working with Controls

    • E1: Setting the visibility of a Field

    • Lesson Learned: Which field, exactly, are you showing or hiding?

    • E2: Disable a Field

    • E3: Set a Field's Focus

    • S3: Set a Field's Focus

    • L2: Using the getAttribute Method

    • L3: Using the getControlType Method

    • Working with Control-Level Notifications

    • Show Me How: Working with Control Notifications


    • Q: Test Your Knowledge

    • Accessing Controls in the Header and Footer

    • Accessing Controls in Business Process Flows

  • 11

    Working with Tabs

    • Sample code for this lesson

    • Working with Tabs

    • Exercise: Setting the Label of a Tab

    • Show Me How: Setting the Label of a Tab

    • Exercise: Showing a Tab

    • Show Me How: Showing a Tab

    • Exercise: Setting the DisplayState of a tab

    • Show Me How: Setting the DisplayState of a tab

    • Show Me How: Adding a custom entity to a Unifiied Interface Application

    • Show Me How: Running the exercises in the UCI interface

    • Test Your Knowledge

    • Bonus Code: Set field visibility based on a Tab's visibility

  • 12

    Working with Sections

    • Sample code for this lesson

    • Working with Sections

    • Exercise: Showing a Hidden Section

    • Show Me How: Showing a Hidden Section

    • Exercise: Setting the Section Label

    • Show Me How: Setting the Section Label

    • Sample Code: Only allow a single checkbox in a section to be checked

    • Test Your Knowledge

  • 13

    Creating Your First Function Library

    • Under Construction! -- But here is where we are headed

    • Sample code for this chapter

  • 14

    Debugging JavaScript

    • DYNAMICS CRM JavaScript Debugging Basics (webinar replay)

    • Learning to read a JavaScript error stack trace

    • A note about this lesson

    • Debugging JavaScript Solution

    • Introduction to JavaScript Debugging using Chrome and Internet Explorer

    • Exercises: Debugging JavaScript - All Labs

    • Show Me How: Exercise 2

    • Show Me How: Exercise 3

    • Show Me How: Exercise 4

    • Show Me How: Exercise 5

    • Show Me How: Exercise 6

    • Show Me How: Exercise 7

    • Show Me How: Exercise 8

  • 15

    Working with OptionSets

    • Sample code for this lesson

    • Introduction to OptionSets and OptionSet Methods

    • Working with OptionSets

    • Exercise 1: Using the getInitialValue Method

    • Show Me How: Using the getInitialValue Method

    • Exercise 2: Using the getOption Method

    • Show Me How: Using the getOption Method

    • Exercise 3: Using the getOptions Method

    • Show Me How: Using the getOptions Method

    • Exercise 4: Using the getSelectedOption Method

    • Show Me How: Using the getSelectedOption Method

    • Exercise 5: Using the getText Method

    • Show Me How: Using the getText Method

    • Exercise 6: Using the clearOptions and addOptions Methods

    • Show Me How: Using the clearOptions and addOptions Methods

    • Exercise 7: Use the removeOption Method

    • Show Me How: Use the removeOption Method

    • Test Your Knowledge

    • Bonus: Show Me How: Creating a Dependent OptionSet - Part 1

    • Bonus: Show Me How: Creating a Dependent Option Set - Part 2

    • Tech Tip: Extract selected options to a string

  • 16

    Working with Lookups

    • L1: Working with the Lookup Data Type

    • Working with Lookups

    • Test Your Knowledge

    • Show Me How Bonus: Working with addCustomView

    • Sample - addCustomView

  • 17

    Working with Collections

    • Sample Code for this lesson

    • formContext Collections

    • Working with JavaScript Collections

    • Collections Exercises

    • Show Me How: Build and Display a List of Navigation Items

    • Show Me How: Build and Display a List of Sections

    • Show Me How: Build and Display a List of OptionSet Fields

    • Test Your Knowledge

  • 18

    Working with formContext.ui Methods

    • Form Types

    • Exercise: Using the getFormType Method

    • Show Me How: Using the getFormType Method

    • Form Notifications

    • Exercise: Using Form Notifications

    • Show Me How: Using Form Notifications

    • close Method

    • refreshRibbon Method

    • Additional Methods

    • Test Your Knowledge

  • 19

    Working with Xrm.Navigation Methods

    • Xrm.Navigation Class Overview

    • Sample code for this module

    • Working with the Xrm.Navigation Methods

    • openAlertDialog Notes

    • Exercise: Using the openAlertDialog Method

    • Show Me How: Using openAlertDialog

    • Exercise: Using the openConfirmDialog Method

    • Show Me How: Using the openConfirmDialog Method

    • Using the openErrorDialog Method

    • Using the openFile Method

    • Exercise: Using the openForm Method

    • Show Me How: Using the openForm Method

    • Exercise: Using the openForm (quick create) method

    • Show Me How: Using the openForm - Quick Create Method

    • Using the openUrl Method

    • Exercise: Using the openUrl Method

    • Show Me How: Using the openUrl Method

    • Using the openWebResource Method

    • Exercise: Using the openWebResource Method

    • Show Me How: Using the openWebResource Method

    • Test Your Knowledge

  • 20

    Using Asynchronous Methods within the Model-Driven Application JavaScript

    • Advanced JavaScript (async and await) Methods and Browser Support

    • Lesson Notes

    • Show Me How: Working with Async and Await methods

  • 21

    Understanding and Working with the Execution Context

    • Exercise: Using the getEventSource Method

    • Show Me How: Using the getEventSource Method

    • setSharedVariable and getSharedVariable Methods

  • 22

    Working with the Save Event

    • Sample Code for this Module

    • getSaveMode Method Return Values

    • Exercise: Working with the getSaveMode Method

    • Show Me How: Working with the getSaveMode Method

    • Exercise: Using the getEventArgs and preventDefault Methods

    • Show Me How: Using the getEventArgs and preventDefault Methods

    • Clean Up Your Exercises

    • Test Your Knowledge

  • 23

    Client-Side Events

    • Sample code for this lesson

    • Client-Side Events Overview

    • Exercise: Using the addOnChange Method

    • Show Me How: Using the addOnChange Method

    • Exercise: Using the fireOnChange Method

    • Show Me How: Using the fireOnChange Method

    • Using the removeOnChange Method

    • Using the addOnSave Method

    • Using the removeOnSave Method

    • Using the close Method

    • Using the Xrm.Page.data.entity.save Method

    • Test Your Knowledge

  • 24

    Working with Xrm.WebApi methods

    • Xrm.WebApi Overview

    • CRM REST Builder Overview

    • Sample code for this module

  • 25

    Working with the JavaScript Utility Methods

    • Introduction

    • Working with the getClient, getClientState, and getFormFactor Methods

    • Working with the getAllowedStatusTransitions Method

    • Working with the getEntityMetadata Method

    • Working with the getLearningPathAttributeName Method

    • Working with the getResourceString Method

    • Working with the invokeProcessAction Method

    • Working with the lookupObjects Method

    • Working with the refreshParentGrid Method

    • Working with the showProgressIndicator and closeProgressIndicator Methods

    • Show Me How: Working with the showProgressindicator and closeProgressIndicator

    • Working with the Xrm.Utility.getGlobalContext Object

    • Working with clientContext.client Methods

    • Working with getGlobalContext.organizationSettings

    • Working with getGlobalContext().userSettings

  • 26

    Using Security Roles to Dynamically Change the UI

    • Under Construction! -- But here is where we are headed

  • 27

    Working with Grids

    • Sample code for this chapter

    • Working with Grids - Part 1 - Setup

    • Introduction to the Grids API

    • Working with Grids - Part 2 - Understanding the Grid Hierarchy

    • GridControl Methods

    • Grid Methods

    • Show Me How: Working with the Grid

    • GridRow methods

    • GetRowData Methods

    • GridEntity Methods

    • GridAttribute Methods

    • GridCell Methods

    • ViewSelector Methods

  • 28

    Working with Process Methods

    • Overview - formContext.ui.process

    • Overview - formContext.data.process

  • 29

    Working with iFrames

    • Source code for this module

    • Overview

    • Exercise: Working with iFrames

    • Show Me How: Working with iFrames

    • Show Me How: Working with the OnReadyStateComplete Event

  • 30

    Working with the Ribbon and Command Bar

    • Overview

  • 31

    Additional Objects and Methods

    • Sample code for this module

    • Xrm.Encoding Overview

    • Show Me How: Using Xrm.Encoding

    • Xrm.Device Overview

    • Xrm.Device.getPosition

    • Show Me How: Using Xrm.Device.getPosition

    • Show Me How: Using Xrm.Device.getBarcode

    • Show Me How: Adding the entityimage field to the Sample Entity - Part 1

    • Show Me How: Using Xrm.Device.captureImage

    • Working with the Form Selector Methods

    • Form Selector Part 1 - Creating a new form

    • Form Selector Part 2 - Switching forms using JavaScript

    • Working with formContext.ui.navigation Methods

    • Xrm.Panel Overview

Investment Options

Choose one of the following investment options:

Bonus material

Along with the course materials, you will receive additional resources that I have developed or use on a weekly basis.

  • UI Library

    The Client API is very wordy, so over time I have developed a JavaScript library containing shortcuts to reduce the amount of code you need to write to perform common functions like showing and hiding components.

  • Toolbox

    I also walk you through the various third-party tools that I use on a daily basis to make my development life easier.

  • Security Library

    If you have ever had a need to use security roles to help customize entity forms, then I have you covered. I have included the library that I use to efficiently retrieve and utilize security roles for dynamics UI construction.


  • Do I have to know JavaScript or be a developer?

    No, I have a free Introduction to JavaScript course, on this site that you may review to get you jump started.

  • Will there be any "classroom activities" or i.e live classes that I have to attend to in order to complete the course? Or is it all prerecorded and in text format so I can complete it in my own pace?

    Most of the content is pre-recorded and new content will be made available every Saturday. Some modules will be face-to-face, because of the nature of the content.

  • Do I have to complete each lesson as it is delivered?

    No. You can complete the work at your own pace, in any time-frame you wish.

  • What if I have questions?

    The course has a built-in community forum should questions arise.

  • Is there any live training?

    We will try and have one live meeting per month to catch up and discuss what questions people may have in a live environment. That is really dependent on my schedule.

    In addition, some of the lessons are taught live because of their complexity, it is just better to review the topics in person.

    Recordings of live-lessons or meet-ups will be available for those who can't attend in person.

  • How much time do need to devote to each weekt?

    That will totally depend on the week. I would say to dedicate two hours per week to review the material and perform the exercises. You may require less, but you may also require more.

    Additionally, if you feel that one of the modules is not something you would need at the present time, you can always skip it and come back to it later, when it is more relevant to the projects you are working on.

  • What is the end-result of the course?

    Well, for one, you have strenghened your knowledge of the customizations aspects of Dynamics 365.

    You will also recieve a certificate that you can print and put on your all or share on LinkedIn.

So what are you waiting for?

Join the ranks of the other Dynamics 365 developers who are using JavaScript to extend their environments and their careers

Your Instructor:

Hi Everyone,

My name is Mitch Milam and I want to personally thank you for taking a look at my course.

The main goal of this course is to teach you what I know about Dynamics 365 JavaScript and to enhance your knowledge of the product and the skillsets required  to do your job.

I started working with Dynamics CRM in November of 2005 when version 3.0 was still in pre-release and I turned knowledge of that product into an entirely new career for myself.

I am very active in the Dynamics community, have written a few books on the topic, and can be found hanging out at most of the Dynamics-related conferences either teaching or presenting. For my community efforts, Microsoft awarded me the Microsoft  MVP title for Dynamics CRM, for eleven years and it was an honor to be listed among the ranks of such a group of talented and generous people.

Thanks again for stopping by and please let me know if I missed anything.