If you ever wanted to add a ribbon button that would be calling a flow (one usage scenario for this is to start sing Power BI Paginated Reports and/or Power Automat Word Templates to generate documents/reports), there is a sample script below which you could use to achieve just that.
Here is how the user experience would look like with this script in place:
Here is what’s happening in the script:
- The script will start by querying the value of the environment variable (which is called ita_documentgenerationflow – you’ll need to change the name of that variable to match your environment). That variable stores HTTP trigger link for the flow to be executed
- The purpose of this variable is to support DEV->TEST->PROD process, since, once the variable is set properly in those environments, the script will use it to execute the flow
- Once the script has that url, it will add record id as a parameter, and it will use “fetch” function to call the flow
- In the success callback it will, then, download generated document
Anyways, here is the script:
function callHTTPFlow(primaryControl) {
"use strict";
debugger;
Xrm.Utility.showProgressIndicator("Generating document...");
getEnvironmentVariable("ita_documentgenerationflow",
function(url){
callHTTPFlowInternal(url, primaryControl);
},
function(error){
handleError(error);
}
);
}
function handleError(error)
{
Xrm.Utility.closeProgressIndicator();
showMessageDialog("Error", error);
}
function callHTTPFlowInternal(url, primaryControl) {
"use strict";
var fileName = "Summary.docx";
var documentId = primaryControl.data.entity.getId();
primaryControl.data.save().then(function() {
documentId = documentId.replace("{", "").replace("}", "");
url = url + "&id=" + documentId;
fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
},
body: null //JSON.stringify(data)
}).then(response => {
Xrm.Utility.closeProgressIndicator();
if (response.status == 200) {
response.blob().then(blob => {
downloadFile(blob, fileName);
closePopups(primaryControl);
});
} else {
response.text().then(body => {
handleError(body);
});
}
}).then(data => console.log(data))
.catch(function(error) {
handleError(error);
});
},
function(error) {
Xrm.Utility.closeProgressIndicator();
showMessageDialog("Error", error.message);
});
}
function closePopups(formContext) {
formContext.data.refresh(false);
Xrm.Utility.closeProgressIndicator();
}
function downloadFile(blob, fileName) {
if (navigator.msSaveBlob) { // IE 10+
navigator.msSaveBlob(blob, fileName);
} else {
var link = document.createElement("a");
if (link.download !== undefined) {
var url = URL.createObjectURL(blob);
link.setAttribute("href", url);
link.setAttribute("download", fileName);
link.style.visibility = 'hidden';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
}
}
function showMessageDialog(messageTitle, message) {
var alertStrings = {
confirmButtonLabel: "OK",
text: message,
title: messageTitle
};
var alertOptions = {
height: 120,
width: 260
};
Xrm.Navigation.openAlertDialog(alertStrings, alertOptions);
}
function getEnvironmentVariable(varName, onSuccess, onError){
"use strict";
Xrm.WebApi.retrieveMultipleRecords("environmentvariabledefinition", "?$select=defaultvalue,displayname&$expand=environmentvariabledefinition_environmentvariablevalue($select=value)&$filter=schemaname eq '"+varName+"'").then(
function success(result) {
var varValue = null;
for (var i = 0; i < result.entities.length; i++) {
if(typeof(result.entities[i]["environmentvariabledefinition_environmentvariablevalue"]) != "undefined"
&& result.entities[i]["environmentvariabledefinition_environmentvariablevalue"].length > 0)
{
varValue = result.entities[i]["environmentvariabledefinition_environmentvariablevalue"][0].value;
}
else if(typeof(result.entities[i].defaultvalue) != "undefined")
{
varValue = result.entities[i].defaultvalue;
}
else{
varValue = null;
}
}
onSuccess(varValue);
},
function (error) {
console.log(error.message);
onError(error);
}
);
}
And here is how the button is configured in the ribbon workbench:
And here is one more screenshot just for completeness – this is how you could configure response action of your flow to work with the script above:
Nov 23: if you wanted to see a more detailed example of the flow, have a look at this post
Why not just use Graph API?
Hey, not sure I understand – could you elaborate?