Join the Power Platform Masterclass #2 starting April 23

Execute JavaScript from rules: Difference between revisions

Jump to navigation Jump to search
No edit summary
(11 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{WIP}}
{{Bridge TOC}}
The [[Resco platform]] offers two main options for adding [[business logic]] to your projects:
The [[Resco platform]] offers two main options for adding client-side [[business logic]] to your projects:
* [[Rules editor|Rules]] which represent the no-code approach for simpler use cases
* [[Rules editor|Rules]] which represent the no-code approach for simpler use cases
* [[Resco JavaScript Bridge]] that allows you to write custom scripts to modify UI, data, and access additional functions
* [[Resco JavaScript Bridge]] that allows you to write custom scripts to modify UI, data, and access additional functions


The option to execute scripts directly from rules combines these two options. It aims to simplify writing JavaScript for Mobile CRM by removing the need for boilerplate code, and it should open path for creating reusable JavaScript libraries with additional functionality for Resco mobile apps, e.g., additional math, date, or string operations, and also business logic.
The option to execute scripts directly from rules combines these two options. It aims to simplify writing JavaScript for Mobile CRM by removing the need for boilerplate code, and it should open a path for creating reusable JavaScript libraries with additional functionality for Resco mobile apps, e.g., additional math, date, or string operations, and also business logic.


For now, this option is supported for form rules
{{Note|For now, this option is supported for form rules and questionnaires. Do not attempt to use the ExecuteJS function in other rules, for example, in views.|Warning}}


== Offline HTML ==
== Offline HTML ==


Some prep work is necessary in the [[Offline HTML]] section of Woodford. TBD
In the [[Offline HTML]] section of Woodford, you need to add the following:
* JSBridge.js (the file provided by Resco that contains the method to execute JS desired function from Woodford rule editor)
* An HTML file with scripts. An example of such a script is available below.


== Adding the function calls to rules ==
== Add function call to form rules ==


TBD
# Edit a [[form]] in Woodford.
# Click '''Add IFrame''' and link to the file script that you uploaded to the offline HTML folder in the previous section.
# Next, open the rules editor for an event, for example, '''On Save'''.
# Create a new variable and use the [[Rules_editor#Operations|operation '''ExecuteJS''']].
 
[[File:Sample executejs rule.png|600px]]
 
== Additional information ==
 
* The operator ExecuteJS is supported only for variables of the following types: Boolean, String, Integer, Double, Float, Decimal, Money, DateTime, StringList, Entity, Lookup.
* In the first argument, select the IFrame form tab that links to the script. In the second argument, enter the name of the JavaScript function.
* The serialized MobileCRM.UI.EntityForm object is automatically passed as a parameter to the function. You cannot pass a custom input parameter.
* The implementation supports also ''promises'' for asynchronous result return from functions.
 
== Questionnaire specifics ==
 
The behavior of the ExecuteJS operator in questionnaire rules is similar to forms:
* It is supported for variables and also whenever you can enter a value; for example for Question.Value.
* In the first argument, simply select the value "IFrame". (Questionnaires don't have multiple tabs for selecting.)
 
[[File:Execute javascript in questionnaire rules.png|600px]]


== Example ==
== Example ==


<syntaxhighlight lang="html">
<syntaxhighlight lang="html"><!DOCTYPE html>
<!DOCTYPE html>
<html>
<html>
<head>
<head>
Line 31: Line 52:
     <script>
     <script>
         function getAccountEntity() {
         function getAccountEntity() {
                                                return new Promise(function(resolve, reject) {
            return new Promise(function(resolve, reject) {
                                                                var contact = new MobileCRM.FetchXml.Entity("account"); // NOTE: If we save to shared variable of type entity ACCOUNT, we need to create/fetch account entity.
                var account = new MobileCRM.FetchXml.Entity("account"); // NOTE: If we save to shared variable of type entity ACCOUNT, we need to create/fetch account entity.
                                                                contact.addAttributes();
                account.addAttributes();
 
 
                var fetch = new MobileCRM.FetchXml.Fetch(account);
                fetch.execute("DynamicEntities", function (res) {
                    var current = res[getRandomInt(res.length)];
                    var entity = new MobileCRM.DynamicEntity(current.entityName, current.id, current.primaryName, clearInvalidProps(current.properties));
                    resolve(entity);
                }, reject, null);
            });
        }
 
 
        function getContactEntity() {
            return new Promise(function (resolve, reject) {
                var contact = new MobileCRM.FetchXml.Entity("contact"); // NOTE: If we save to shared variable of type entity ACCOUNT, we need to create/fetch account entity.
                contact.addAttributes();
 
 
                var fetch = new MobileCRM.FetchXml.Fetch(contact);
                fetch.execute("DynamicEntities", function (res) {
                    var current = res[getRandomInt(res.length)];
 
 
 
                    var entity = new MobileCRM.DynamicEntity(current.entityName, current.id, current.primaryName, clearInvalidProps(current.properties));
                    resolve(entity);
                }, reject, null);
            });
        }
 


                                                                var fetch = new MobileCRM.FetchXml.Fetch(contact);
        function modifyCurrentEntitySimple(entityForm) {
                                                                fetch.execute("DynamicEntities", function (res) {
            entityForm.entity.properties.fax = getRandomInt(10);
                                                                                var current = res[getRandomInt(res.length)];
                                                                                var entity = new MobileCRM.DynamicEntity(current.entityName, current.id, current.primaryName, clearInvalidProps(current.properties));
                                                                                resolve(entity);
                                                                }, reject, null);
                                                });
         }
         }


         function getLookUp() {
         function getLookUp() {
                                                return new Promise(function(resolve, reject) {
            return new Promise(function(resolve, reject) {
                                                                var account = new MobileCRM.FetchXml.Entity("contact");
                var contact = new MobileCRM.FetchXml.Entity("contact");
                                                                account.addAttributes();
                contact.addAttributes();


                                                                var fetch = new MobileCRM.FetchXml.Fetch(account);
                                                                fetch.execute("DynamicEntities", function (res) {
 
                                                                                var current = res[getRandomInt(res.length)];
                var fetch = new MobileCRM.FetchXml.Fetch(contact);
                                                                                resolve(new MobileCRM.Reference(current.entityName, current.id, current.primaryName));
                fetch.execute("DynamicEntities", function (res) {
                                                                }, reject, null);
                    var current = res[getRandomInt(res.length)];
                                                });
                    resolve(new MobileCRM.Reference(current.entityName, current.id, current.primaryName));
                }, reject, null);
            });
         }
         }


         function getInteger() { return getRandomInt(128); }
         function getInteger() { return getRandomInt(128); }
         function getString() { return getRandomString(); }
         function getString() { return getRandomString(); }
         function getDecimal() {
         function getDecimal() {
                                                var precision = 100; // 2 decimals
            var precision = 100; // 2 decimals
                                                return Math.floor(Math.random() * (10 * precision - 1 * precision) + 1 * precision) / (1 * precision);
            return Math.floor(Math.random() * (10 * precision - 1 * precision) + 1 * precision) / (1 * precision);
         }
         }
         function getStringList() {
         function getStringList() {
                                                var res = [];
            var res = [];
                                                for (var i = 0; i < getRandomInt(); i++)
            for (var i = 0; i < getRandomInt(); i++)
                                                                res.push(getRandomString());
                res.push(getRandomString());
 


                                                return res;
            return res;
         }
         }
         function getDateTime() {
         function getDateTime() {
                                                var dt = new Date();
            var dt = new Date();
                                                return dt.toLocaleTimeString();
            return dt.toLocaleTimeString();
         }
         }


         // **** Helpers ****
         // **** Helpers ****


         function getRandomString(length) {
         function getRandomString(length) {
                                                var len = length || 7;
            var len = length || 7;
                                                return Math.random().toString(36).substring(len);
            return Math.random().toString(36).substring(len);
         }
         }
         function getRandomInt(maximum) {
         function getRandomInt(maximum) {
                                                var max = maximum || 4;
            var max = maximum || 4;
                                                return Math.floor(Math.random() * Math.floor(max));
            return Math.floor(Math.random() * Math.floor(max));
         }
         }
     </script>
     </script>
</body>
</body>
</html>
</html></syntaxhighlight>
</syntaxhighlight>


[[Category:Woodford]]
[[Category:Woodford]]

Navigation menu