Showing posts with label Xrm.Utility. Show all posts
Showing posts with label Xrm.Utility. Show all posts

Friday, October 28, 2016

Set PartyList or Regarding Lookup when using Xrm.Utility object

When using Xrm.Utility object to open entity form or quick Create form, we cannot set PartyList or Regarding Lookup with default field parameters. But there is workaround for this, we can use custom query string parameters and using custom query string parameters we can set PartyList or regarding lookup.
Suppose we want to open email entity form from contact entity and want to set To and 
Regarding lookup when email entity form opened using either
 Xrm.Utility.openEntityForm or Xrm.Utility.openQuickCreate
  
·         Open Email Form or quick create form
·         In Form properties, select Parameter tab.
·         Add 3 parameters, to set To partylist.
Name: new_ToType
Type: SafeString
Name: new_ToName
Type: SafeString
Name: new_ToId
Type: UniqueId
·         Add 3 parameters, to set Regarding lookup
Name: new_RegardingIdName
Type: SafeString
Name: new_RegardingIdType
Type: SafeString
Name: new_RegardingId
Type: UniqueId



·         In Email form load event add JavaScript, which will get query string parameters and will set To party and Regarding lookup.
var emailScript =
{
    setPartyListnRegarding: function () {
        if (Xrm.Page.ui.getFormType() == 1) {

            /*To Party list*/
            var ToPartyList = [];
            ToPartyList[0] = {};

            if (Xrm.Page.context.getQueryStringParameters().new_ToType != null && Xrm.Page.context.getQueryStringParameters().new_ToType != 'undefined') {
                ToPartyList[0].entityType = Xrm.Page.context.getQueryStringParameters().new_ToType;
            }

            if (Xrm.Page.context.getQueryStringParameters().new_ToId != null && Xrm.Page.context.getQueryStringParameters().new_ToId != 'undefined') {
                ToPartyList[0].id = Xrm.Page.context.getQueryStringParameters().new_ToId;
            }
            if (Xrm.Page.context.getQueryStringParameters().new_ToName != null && Xrm.Page.context.getQueryStringParameters().new_ToName != 'undefined') {
                ToPartyList[0].name = Xrm.Page.context.getQueryStringParameters().new_ToName;
            }

            /*Set To Partylist*/
            if (ToPartyList[0] != null && ToPartyList[0].id != null && ToPartyList[0].id != 'undefined')
                Xrm.Page.getAttribute("to").setValue(ToPartyList);

            /*Regarding Object Id*/
            var regarding = [];
            regarding[0] = {};

            if (Xrm.Page.context.getQueryStringParameters().new_RegardingIdName != null && Xrm.Page.context.getQueryStringParameters().new_RegardingIdName != 'undefined') {
                regarding[0].name = Xrm.Page.context.getQueryStringParameters().new_RegardingIdName;
            }
            if (Xrm.Page.context.getQueryStringParameters().new_RegardingId != null && Xrm.Page.context.getQueryStringParameters().new_RegardingId != 'undefined') {
                regarding[0].id = Xrm.Page.context.getQueryStringParameters().new_RegardingId;
            }
            if (Xrm.Page.context.getQueryStringParameters().new_RegardingIdType != null && Xrm.Page.context.getQueryStringParameters().new_RegardingIdType != 'undefined') {
                regarding[0].entityType = Xrm.Page.context.getQueryStringParameters().new_RegardingIdType;
            }
            if (regarding[0] != null && regarding[0].id != null && regarding[0].id != 'undefined')
                Xrm.Page.getAttribute("regardingobjectid").setValue(regarding);
        }
    },

};
·         In Contact form event when want to open email form, we need to pass these query string parameters which are defined above
var contactScript = {
    openEmail: function () {
       
        var parameters = {};
        /*Custom querystring parameter*/

        parameters["new_ToType"] = Xrm.Page.data.entity.getEntityName();
        parameters["new_ToName"] = Xrm.Page.getAttribute("fullname").getValue();
        parameters["new_ToId"] = Xrm.Page.data.entity.getId(); // current contact Id

        parameters["new_RegardingIdType"] = Xrm.Page.context.getQueryStringParameters().etc;
        parameters["new_RegardingIdName"] = Xrm.Page.getAttribute("fullname").getValue();
        parameters["new_RegardingId"] = Xrm.Page.data.entity.getId(); // current contact Id

        var windowsOptions = {};
        windowsOptions["openInNewWindow"] = true;

        Xrm.Utility.openEntityForm("email",null, parameters,  windowsOptions);
    },
   
};


·         Save all changes and publish.

·         Now when Email Form opened from Contact entity, using Xrm.Utiltiy, we will see To, and Regarding lookup is already set. 




Thursday, October 27, 2016

Get / Set Query string parameters to CRM form.


When using Xrm.Utitliy object to open entity form or Quick create form, sometimes we need to pass query string parameters.
In MS CRM you can enable CRM forms to accept query strings, and you can retrieve those query string parameters in form events.

Set Query string parameters

a.      Go to Entity customization
b.      Open form, where you want to add query strings parameters
c.       Click on Form Properties
d.     In form properties window you will see Parameters tabs.
e.      Add Parameters, which you want to get it, when using openEntityForm or openQuickCreate
f.        When adding parameter need to specify name and data type.



NOTE: In Each parameter name MUST contains at least one underscore (‘_’) character. And name cannot be started with underscore or “crm_”.  Microsoft recommends that you should use solution publisher prefix when defining parameter name, e.g abc_queryString_contactId

g.      We can pass Boolean, Datetime, double, entitytype, Integer, long, PositiveInteger, SafeString, UniqueId, UnsignedInt types of parameters.

Pass Query String parameters to form using openEntityForm or openQuickCreate

openContactForm: function () {
       
        var parameters = {};
        /*Custom querystring parameter*/

        parameters["qryParam_boolean"] = 0; // Boolean value - 0,1, true, false
        var startDate = new Date();
        parameters["qryParam_datetime"] = startDate.format("MM/dd/yyyy"); // date time
        parameters["qryParam_double"] = 1.0; //double
        parameters["qryParam_eType"] = 2; // Entity Type Code
parameters["qryParam_eType"] = Xrm.Page.context.getQueryStringParameters().etc; // Another way to get Entity Type Code
        parameters["qryParam_integer"] = 100;  //Integer
        parameters["qryParam_long"] = 100000; // Long
        parameters["qryParam_positiveinteger"] = 1; // Positive Integer including 0
        parameters["qryParam_safestring"] = "safestring"; //string
        parameters["qryParam_uniqueId"] = Xrm.Page.data.entity.getId(); //GUID
        parameters["qryParam_unsignedInt"] = 1; //unsigned integer


        var windowsOptions = {};
        windowsOptions["openInNewWindow"] = true;

        Xrm.Utility.openEntityForm("new_manufacture",null, parameters,  windowsOptions);
    },

Retrieve Parameters value, when entity form is opened.

To get parameter value, we need to use Xrm.Page.context.getQueryStringParameters()

getQueryStringParamters: function () {
        var booleanParam;
        var datetimeParam;
        var doubleParam;
        var entitytypeParam;
        var integerParam;
        var longParam;
        var positiveintegerParam;
        var safestringParam;
        var uniqueIdParam;
        var unsignedIntParam;


        if (Xrm.Page.context.getQueryStringParameters().qryParam_boolean != null && Xrm.Page.context.getQueryStringParameters().qryParam_boolean != 'undefined') {
            booleanParam = Xrm.Page.context.getQueryStringParameters().qryParam_boolean;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_datetime != null && Xrm.Page.context.getQueryStringParameters().qryParam_datetime != 'undefined') {
            datetimeParam = Xrm.Page.context.getQueryStringParameters().qryParam_datetime;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_double != null && Xrm.Page.context.getQueryStringParameters().qryParam_double != 'undefined') {
            doubleParam = Xrm.Page.context.getQueryStringParameters().qryParam_double;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_eType != null && Xrm.Page.context.getQueryStringParameters().qryParam_eType != 'undefined') {
            entitytypeParam = Xrm.Page.context.getQueryStringParameters().qryParam_eType;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_integer != null && Xrm.Page.context.getQueryStringParameters().qryParam_integer != 'undefined') {
            integerParam = Xrm.Page.context.getQueryStringParameters().qryParam_integer;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_long != null && Xrm.Page.context.getQueryStringParameters().qryParam_long != 'undefined') {
            longParam = Xrm.Page.context.getQueryStringParameters().qryParam_long;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_positiveinteger != null && Xrm.Page.context.getQueryStringParameters().qryParam_positiveinteger != 'undefined') {
            positiveintegerParam = Xrm.Page.context.getQueryStringParameters().qryParam_positiveinteger;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_safestring != null && Xrm.Page.context.getQueryStringParameters().qryParam_safestring != 'undefined') {
            safestringParam = Xrm.Page.context.getQueryStringParameters().qryParam_safestring;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_uniqueId != null && Xrm.Page.context.getQueryStringParameters().qryParam_uniqueId != 'undefined') {
            uniqueIdParam = Xrm.Page.context.getQueryStringParameters().qryParam_uniqueId;
        }
        if (Xrm.Page.context.getQueryStringParameters().qryParam_unsignedInt != null && Xrm.Page.context.getQueryStringParameters().qryParam_unsignedInt != 'undefined') {
            unsignedIntParam = Xrm.Page.context.getQueryStringParameters().qryParam_unsignedInt;
        }
      
    },
Now you can set value to form or add any logic based on passed parameters.


View or Download All attachments for single record

In MS CRM you can attach different types of documents to notes. There are some file extensions of attachments are blocked by default by CRM, also you can add / remove file extensions from blocked list.
You will find blocked extensions for attachment in Settings à Administration à System Settings.

In MS CRM you can attach one attachment per note, and to view attachment you have to download it, then only you can able to view.
Also to view attachments for particular record, we need to open each note and download individual.

To view all attachments of single record in single page, I create one solution with HTML web resource, which will give option to view (extensions restricted) attachments or download attachment from single page.


To create this solution I used one HTML web resource.

Steps to create view Attachment Page.
 1.      To show button on records form
a.      Create one Ribbon button “View Attachment” using ribbon workbench.

b.      In Button command Add Action – JavaScript Command.
c.       In JavaScript command call function – OpenViewAttachment


d.     If want you can add Display Rules or Enable Rules, for when to show this button.
2.      JavaScript library - new_js/contactScript.js

contactScript =
{
    OpenViewAttachment: function () {
        // get current Record Id
        var recordId = Xrm.Page.data.entity.getId();
        var customParam = encodeURIComponent("recordId=" + recordId);
        //pass current record Id to Web resource, to retrieve all attachments from note.
        Xrm.Utility.openWebResource("new_HTML/AttachmentViewer.html", customParam);
    },
}

1.      HTML Web resource
a.      In HTML web resource add script reference for jquery_1.10.2.js, Jquery_ui_1.10.4.min.js and ClientGlobalContext.js.aspx
b.      In Web resource, calling two functions when document is ready
                                                              i.      getDataParam()
This function is used to get query string parameter (recordId) which we passed from OpenViewAttachment function, when opening HTML web resource.
                                                           ii.      GetCurrentRecordAttachments()
This function will retrieve all notes with attachment, and show list of notes & attachment.
Here is complete code of HTML web resource 


<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="../ClientGlobalContext.js.aspx" type="text/javascript"></script>
    <script src="../new_js/jquery_1.10.2.js" type="text/javascript"></script>
    <script src="../new_js/Jquery_ui_1.10.4.min.js" type="text/javascript"></script>
    <style>
        .fixed_headers {
            width: 100%;
            table-layout: fixed;
            /*border-collapse: collapse;*/
            border: thin solid #b3b3b3;
        }

            .fixed_headers th {
                text-decoration: underline;
            }

            .fixed_headers th,
            .fixed_headers td {
                padding: 5px;
                text-align: left;
            }

                .fixed_headers td:nth-child(1),
                .fixed_headers th:nth-child(1) {
                    min-width: 5%;
                }

                .fixed_headers td:nth-child(2),
                .fixed_headers th:nth-child(2) {
                    min-width: 25%;
                }

                .fixed_headers td:nth-child(3),
                .fixed_headers th:nth-child(3) {
                    width: 10%;
                }

                .fixed_headers td:nth-child(4),
                .fixed_headers th:nth-child(4) {
                    width: 10%;
                }

                .fixed_headers td:nth-child(5),
                .fixed_headers th:nth-child(5) {
                    width: 25%;
                }

                .fixed_headers td:nth-child(6),
                .fixed_headers th:nth-child(6) {
                    width: 25%;
                }

            .fixed_headers thead {
                background-color: #b3ccff;
                color: #fdfdfd;
            }

                .fixed_headers thead tr {
                    display: block;
                    position: relative;
                }

            .fixed_headers tbody {
                display: block;
                overflow: auto;
                width: 100%;
                height: 200px;
            }

                .fixed_headers tbody tr:nth-child(even) {
                    background-color: #cce5ff;
                }

        .old_ie_wrapper {
            height: 200px;
            width: 100%;
            overflow-x: hidden;
            overflow-y: auto;
        }

            .old_ie_wrapper tbody {
                height: auto;
            }
    </style>

    <script type="text/javascript">
        var recordId;
        $(document).ready(function () {
            getDataParam();
            GetCurrentRecordAttachments();
        });

        function getDataParam() {
            var vals = new Array();
            if (location.search != "") {
                vals = location.search.substr(1).split("&");
                for (var i in vals) {
                    vals[i] = vals[i].replace(/\+/g, " ").split("=");
                }
                //look for the parameter named 'data'
                var found = false;
                for (var i in vals) {
                    if (vals[i][0].toLowerCase() == "data") {
                        parseDataValue(vals[i][1]);
                        break;
                    }
                }
            }
            else {
                noParams();
            }
        }

  function noParams() {
            alert('No data parameter was passed to this page.');
        }
        function parseDataValue(datavalue) {
            if (datavalue != "") {
                var vals = new Array();
                vals = decodeURIComponent(datavalue).split("&");
                for (var i in vals) {
                    vals[i] = vals[i].replace(/\+/g, " ").split("=");
                    if (vals[i][0].toLowerCase() == "recordid") {
                        recordId = vals[i][1];
                        recordId = recordId.replace('{', '');
                        recordId = recordId.replace('}', '');
                        break;
                    }
                }
            }
        }
        function GetCurrentRecordAttachments() {
            var container = $('#my-container'),
                table = $('< table class="fixed_headers" >');
            var thead = $('< thead >');
            var theadTr = $('< tr >');

            theadTr.append('< th > Subject</ th >');
            theadTr.append('< th > File Name</ th >');
            theadTr.append('< th > File Type</ th >');
            theadTr.append('< th > View / Download< /th >');
            thead.append(theadTr);
            table.append(thead);

            var viewInBrowser = ["image/png", "text/plain", "application/pdf", "image/jpg", "image/bmp"];

            var req = new XMLHttpRequest();
            req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v8.0/annotations?$select=annotationid,documentbody,filename,mimetype,subject&$filter=_objectid_value eq " + recordId + " and  isdocument eq true", true);         
 req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("Prefer", "odata.include-annotations=\"OData.Community.Display.V1.FormattedValue\"");
            req.onreadystatechange = function () {
                if (this.readyState === 4) {
                    req.onreadystatechange = null;
                    if (this.status === 200) {
                        var results = JSON.parse(this.response);
                        for (var i = 0; i < results.value.length; i++) {
                            var annotationid = results.value[i]["annotationid"];
                            var documentbody = results.value[i]["documentbody"];
                            var filename = results.value[i]["filename"];
                            var mimetype = results.value[i]["mimetype"];
                            var subject = results.value[i]["subject"];


                            var tr = $('< tr >');
                            tr.append('< td >' + subject + '< /td >');
                            tr.append('< td >' + filename + '< /td >');
                            var url = "data:" + mimetype + ";base64," + documentbody;
                            var id = "h" + i;
                            tr.append('< td >' + mimetype + ' < input id="' + id + '" type="hidden" value="' + url + '" />   < /td >');

                            var Isview = false;
                            for (var j = 0; j < viewInBrowser.length; j++) {
                                if (viewInBrowser[j] == mimetype) {
                                    Isview = true;
                                    break;
                                }
                            }

                            if (Isview) {
                                var alink = "< a id ='" + id + "' href='#' onclick='showData(this);' > View </ a >";
                                tr.append('< td >' + alink + '</ td >');
                            }
                            else {
                                var alink = "< a id ='" + id + "' href='#' onclick='showData(this);'> Download </ a >";
                                tr.append('< td >' + alink + '</ td>');
                            }

                            table.append(tr);
                        }
                    }
                    else {
                        alert(this.statusText);
                    }
                }
            };
            container.append(table);
            req.send();
        }
        function showData(ctrl) {
            var id = ctrl.id;
            var url = $('#' + id).val();
            document.getElementById("itempreview").src = url;
        }
    </script>
</head>
<body>
    <div id="my-container">
    </div>
    <br />
    <span style="font-weight: 700"> View Attachment</span>
    <div>
         <br />
        <iframe id="itempreview" style="height: 600px; width: 800px"></iframe>
    </div>
</body>
</html>




With this HTML web resource, we can view attachments which are images, PDF or text, if attachments are word document, excel, PowerPoint etc., and then need to download.

Hope this will help..