ECB Menu in Sharepoint List or Document Library allows one to manually trigger an action, and this could be an action to start a workflow from Nintex Workflow Cloud. We would love to have the option to manually trigger a workflow to start.
Here is the story line, looking at a document library in Sharepoint, based on the use case we discussed in my previous blog post, a Marketing Coordinator uploads the Excel Attendant List to a Sharepoint folder in Marketing Site’s Document Library, in this case, not all the documents in the library are leads to be generated in Salesforce, only this particular excel file is, and we want to manually trigger a Nintex Workflow Cloud workflow to help collect and upload leads from this file to SalesForce. To do that, we can simply add a custom ECB Menu to the Document Library (i.e. same applies to Custom List in Sharepoint). Diagram below illustrates what you will get:
Before we get into how to add the ECB menu in Sharepoint Document Library, let us take a look at how to start a workflow in Nintex Workflow Cloud. We going to use the “Public web form” Start event option in this exercise, the configuration of a sample workflow Start Event is shown in the diagram below:
This configuration will give us a web form URL with the format of https://{your-tenant}.workflowcloud.com/forms/{workflow-id}. Using Fiddler to trace the form submission, you will find the form is being submitted with the following HTTP POST request.
POST https://{your-tenant}.workflowcloud.com/api/v1/anonymous-workflow/{workflow-id} HTTP/1.1
Host: {your-tenant}.workflowcloud.com
Connection: keep-alive
Content-Length: 165
Accept: application/json, text/plain, */*
Origin: https://{your-tenant}.workflowcloud.com
:
:
Content-Type: application/json;charset=UTF-8
:
:
{“se_file_name1″:”/NWC%20Test/event%20lead.xlsx”}
With the HTTP POST request details we learned, we will be able to include a HTTP POST request in our ECB menu action. Again, there are different ways to achieve that – Sharepoint-Hosted Add-ins, Provider-Hosted Add-ins, and simply the way we going to get that without the need to create an add-in using Visual Studio is the Display Template client side JavaScript.
1. Edit the Document Library page by selecting the Edit Page from the page menu as shown.
2. Insert a Content Editor web part to the page,
3. With the cursor in the Content Editor’s content area, click Edit Source to edit the source of the content
4. Here is the JavaScript code to be included in the Content Editor’s source
<script language="”javascript”" type="text/javascript">
function Custom_AddDocLibMenuItems(m, ctx)
{
var strDisplayText = 'Upload to SalesForce';
var strImagePath = '';
var strAction = 'send2NWC()';
// Add our new menu item
CAMOpt(m, strDisplayText, strAction, strImagePath);
// add a separator to the menu
CAMSep(m);
// false means that the standard menu items should also be rendered
return false;
}
function CAMOpt(p,wzText,wzAct,wzISrc,wzIAlt,wzISeq,wzDesc)
{
var mo=CMOpt(wzText,wzAct,wzISrc,wzIAlt,wzISeq,wzDesc);
if(!mo)return null;
if(wzText != "Delete Item") AChld(p,mo);
return mo;
}
function send2NWC()
{
var url = "https://{your-tenant}.workflowcloud.com/api/v1/anonymous-workflow/{workflow-id}";
var method = "POST";
//depending on the value you passing to the workflow, I am using selected item's Url here
var postData = '{"se_file_name1":"' + currentItemFileUrl + '"}';
var async = true;
var request = new XMLHttpRequest();
request.onload = function () {
var status = request.status; // HTTP response status, e.g., 200 for "200 OK"
var data = request.responseText; // Returned data, e.g., an HTML document.
}
request.open(method, url, async);
request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
// Sends the request to the server.
request.send(postData);
alert('Leads uploaded');
}
</script>
Tip: Few quick references getting values from Sharepoint Display Template:
currentItemFileUrl (i.e. selected item’s URL)
currentItemID (i.e. selected item’s ID in the list)
_spPageContextInfo.listId (i.e. List Id)
_spPageContextInfo.siteId (i.e. Site ID)
ctx.listName (i.e. List ID)
ctx.ListData.Row[currentItemID-1].UniqueId (i.e. selected item’s GUID)
ctx.ListData.Row[currentItemID-1].{column name} (i.e. list column value)