Skip to content

Instantly share code, notes, and snippets.

@heliconho
Created November 14, 2023 03:49
Show Gist options
  • Save heliconho/03458e79894972cd4736dde6b553bcf1 to your computer and use it in GitHub Desktop.
Save heliconho/03458e79894972cd4736dde6b553bcf1 to your computer and use it in GitHub Desktop.
D365 button utility
function getSelectedProducts(selectedRecords) {
"use strict";
var templateId = "" //from document template entity
var query = []
var tc;
var entity = ""
var keyCol = entity + "id"
for(var x = 0; x < selectedRecords.length; x++) {
console.log(selectedRecords[x]);
query.push(keyCol + " eq " + selectedRecords[x].Id + " ")
tc = selectedRecords[x].TypeCode;
}
var finalQuery =
query.length > 1 ? query.map(function(item, index) { if (index !== query.length - 1) {return item + " or ";} else {return item;}}).reduce(function(accumulator, currentValue) {return accumulator + currentValue;}, "")
:
query[0]
Xrm.WebApi.retrieveMultipleRecords(entity, "?$select=dacrm_donationtransactionid,_dacrm_donorname_value&$filter=("+finalQuery+")").then(
function success(results) {
console.log(results);
for (var i = 0; i < results.entities.length; i++) {
var result = results.entities[i];
// Columns
var dacrm_donationtransactionid = result["dacrm_donationtransactionid"]; // Guid
var dacrm_donorname = result["_dacrm_donorname_value"]; // Lookup
var dacrm_donorname_formatted = result["_dacrm_donorname_value@OData.Community.Display.V1.FormattedValue"];
var dacrm_donorname_lookuplogicalname = result["_dacrm_donorname_value@Microsoft.Dynamics.CRM.lookuplogicalname"];
console.log({
dacrm_donationtransactionid : dacrm_donationtransactionid,
dacrm_donorname : dacrm_donorname,
dacrm_donorname_formatted : dacrm_donorname_formatted,
dacrm_donorname_lookuplogicalname : dacrm_donorname_lookuplogicalname,
})
var fileName = "Thank You Letter - "+dacrm_donorname_formatted +".docx"
console.log(fileName)
ExecuteWordMerge(templateId,tc,dacrm_donationtransactionid,9940,fileName,fileName)
}
},
function(error) {
console.log(error.message);
}
);
}
function ExecuteWordMerge (wordtemplateid, entitytypecodeint, ids, templatetype, fieldforfilename, filenameoverride) {
try {
Xrm.Page.ui.clearFormNotification("worderror");
var funcpath = Xrm.Page.context.getClientUrl() + "/_grid/print/print_data.aspx";
if (typeof ids !== "object") {
var tids = ids;
ids = new Array();
ids.push(tids);
}
var wordTemplateId = wordtemplateid;//"f1f7b994-543b-e711-8106-c4346bac2908" test data;
var currentEntityTypeCode = entitytypecodeint;//"10063" test data;
var templateType = (templatetype || 9940); //9940 is global and 9941 is personal
var fieldForFileName = (fieldforfilename || "");
var formdata = "exportType=MergeWordTemplate&selectedRecords=" + encodeURIComponent(JSON.stringify(ids)) +
"&associatedentitytypecode=" + currentEntityTypeCode + "&TemplateId=" + wordTemplateId + "&TemplateType=" + templateType;
var req = new XMLHttpRequest();
req.open("POST", funcpath, true);
req.responseType = "arraybuffer";
req.setRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
req.setRequestHeader("Accept-Language", "en-US,en;q=0.8");
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
req.onreadystatechange = function () {
if (this.readyState == 4) {/* complete */
req.onreadystatechange = null;
if (this.status >= 200 && this.status <= 299) {//200 range okay
var mimetype = (2 === 2) ? "application/vnd.openxmlformats-officedocument.wordprocessingml.document" : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
var blob = new Blob([req.response], { type: mimetype });
var fileNameTemplate = req.getResponseHeader('content-disposition').split('filename=')[1].replace(/'/g, "");
var dloadurl = URL.createObjectURL(blob);
var filename = (fieldForFileName !== "" && Xrm.Page.getAttribute(fieldForFileName) !== null && Xrm.Page.getAttribute(fieldForFileName).getValue() !== "") ?
Xrm.Page.getAttribute(fieldForFileName).getValue() : fileNameTemplate;
filename = filenameoverride || filename;
//new code, prevent IE errors
if (navigator.msSaveOrOpenBlob) {
navigator.msSaveOrOpenBlob(blob, filename);
return;
}
else if (window.navigator.msSaveBlob) { // for IE browser
window.navigator.msSaveBlob(blob, filename);
return;
}
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = dloadurl;
a.download = filename;
a.click();
URL.revokeObjectURL(dloadurl);
//window.location = dloadurl;//we can use just this instead of creating an anchor but we don't get to the name the file
}
else {
Xrm.Page.ui.setFormNotification("An Error occurred generating the word document, please contact support if the issue persists,code: " + this.status, "ERROR", "worderror");
}
}
};
req.send(formdata);
}
catch (err) {
Xrm.Page.ui.setFormNotification("An Error occurred generating the word document, please contact support if the issue persists. " + err.message, "ERROR", "worderror");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment