Quantcast
Channel: SharePoint 2013 - Development and Programming forum
Viewing all articles
Browse latest Browse all 25064

Bulk Approval for multiple tasks in SharePoint OOTB Task list

$
0
0

Hi all, 

Environment: SharePoint Online     

Background: Client have multiple tasks in SharePoint OOTB Task list for different workflows and each workflow has its different business logic using Nintex workflows. Client requested to have bulk approval as custom action on Ribbon Control on the task list.

Challenge:
   
I am developing SharePoint Add-in to meet this above requirement.

  • User selects Tasks from the SharePoint Task list.
  • Click on Bulk Approval custom action.
  • I am able to show the selected IDs. As shown below:

  • I need to show to user click Yes to approve the selected tasks and No if he wishes to cancel. 
    Q:  How could I show Yes  / No options (Javascript??) in the dialog box using custom ribbon action within the SharePoint Add-in?

    This my custom action for ribbon control (Bulk Approval)

<?xml version="1.0" encoding="utf-8"?><Elements xmlns="http://schemas.microsoft.com/sharepoint/"><CustomAction Id="9809f0a6-4abc-4c2a-a6e6-c57ef9647647.BulkApprovalCustomAction"
                RegistrationType="List"
                RegistrationId="107"
                Location="CommandUI.Ribbon"
                Sequence="10001"
                Title="Bulk Approval" HostWebDialog="true" HostWebDialogHeight="300" HostWebDialogWidth="400"><CommandUIExtension><!--
      Update the UI definitions below with the controls and the command actions
      that you want to enable for the custom action.
      --><CommandUIDefinitions><CommandUIDefinition Location="Ribbon.ListItem.Actions.Controls._children"><Button Id="Ribbon.ListItem.Actions.BulkApprovalCustomActionButton"
                  Alt="Bulk Approval"
                  Sequence="100"
                  Command="Invoke_BulkApprovalCustomActionButtonRequest"
                  LabelText="Bulk Approval"
                  TemplateAlias="o1"
                  Image32by32="data:image/png;base64,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"
                  Image16by16="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAIAAADAAbR1AAAABnRSTlMAAAAAAABupgeRAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAADW0lEQVQ4y+1Ua0hTYRg+FNmFJMuwm0lWGllQPyoqMyIl0yJmhhJIlmkRRZrLsMQsLbXmtc1t52w7ntvcKg3dbF4qzWUbNstpKrO8z61mVqZu0x23k9OgwqKfEfT8eHl5vu95vof3hQ8A/uNPYK1n2Vi23li9k95JZ+iv6a/Rve7P7E/rExlshoYEacLmhJOyUkmZ9KnFSm4lHfJA9gI2IF/3vOh5kTJJ9U5lUL6vp9UfVFhVUlXmxYY497jt1eCTiCfvqUkAPAf+Sv5Kajok9pJ6NPlKCpwek+h2bUHGbIaGkcEvgl1gR+o3SG1PzrkRkHvq5un0PmIdcZjYCHCbwSrwMWn5fsmq/963eGvimpl18S+uK4+lPLqxOsU9V8TcygymLv3gGjKpUtlribjMtewaNpsIFC5JiEl0TfQEQAcQBy9bt/060WfEdIKiyA57j3thZmRW9itmNCt6nGNnbP4TxnOti3+txWeIgkVygLcIagLN04+7fIwi0mOfMjGoej0UpUjSj+ChKMRPywni3oIkI41Nw4pa3Tn6kYPawTa5qPL4UOwXoanV2Kuoqj5DUR8cuuMFm/FGohfA5iFRAk+1y4CfKUcx0OP/MX0y2+PkB9jOuqwgPCW25t3nYjuHYPAY1JqlyZNzPKgWO/PlWXkyAWn0gVI3X2Vn2MujFTpZobqgdCoi7x6mJfwA4SFcDo/U7mzd80kYQkuaU32EXsJsqTq/Vx1dUShpc9ORxogpATgEbeHmZS1nxbDvTDHmDy3Nxb697pc8Ahhvhi+cCR0fLHgaeV/97YFyVIlrAbQBjYY7pyhZSH3HoP9uX/rM0r2y/Spld+mPQwMp3kPe1dwVkASmkVjb6Avbxw10NNBKavUGnYrqGdVapKZNhd45qya2ljYwDJcIs8XBAHcF18z1MnlYDpk2WTInhmN45dyu0SMmI6k200j5hPNS8ydr3Piz3EYmzJTfqYfCBY5j4TrXt+62PW3BdZyfd2e5aSmiqLHGIZ/8JmK4YD4g1osZ4tPoMtQZicTbMQMiE6UK56O70EfIS3gof2H+FhjDdmCp2FlBmGCtYAdLzY7kOPGUeKiwkocURN0N4HTBUL6RQ+efE6wBy5ESzBOuxX2J17e7GN0ZB/72R/IP4CumCKj64/tW0AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNi0xMi0wN1QxMDo0Nzo1My0wNjowMKGS4TgAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTYtMTItMDdUMTA6NDc6NTMtMDY6MDDQz1mEAAAAAElFTkSuQmCC" /></CommandUIDefinition></CommandUIDefinitions><CommandUIHandlers><CommandUIHandler Command="Invoke_BulkApprovalCustomActionButtonRequest"
                          CommandAction="~appWebUrl/Pages/Default.aspx?{StandardTokens}&amp;SPListItemId={SelectedItemId}&amp;SPListId={SelectedListId}"/></CommandUIHandlers></CommandUIExtension ></CustomAction></Elements

  • If a user choose the clicks Yes, then I need to set the workflow statuses to be "Approved" for all the document libraries and custom lists irrespective of the workflow business logic defined.  
    Q: How could I achieve this?  Any sample code would be very beneficial. 

    This my App.js code for SharePoint Add-in code.
var context;
var user;

var hostweburl;
var appweburl;
var listItemIds;
var countOfIDs


var targetList = "Tasks"



$(document).ready(function () {
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', constructURL);
});

// This function is executed after the DOM is ready and SharePoint scripts are loaded
// Place any code you want to run when Default.aspx is loaded in this function
// The code creates a context object which is needed to use the SharePoint object model
function constructURL() {

    hostweburl = getQueryStringParameter("SPHostUrl");
    appweburl = getQueryStringParameter("SPAppWebUrl");
    listItemIds = getQueryStringParameter("SPListItemId");

    hostweburl = decodeURIComponent(hostweburl);
    appweburl = decodeURIComponent(appweburl);
    listItemIds = getQueryStringParameter("SPListItemId");


    if (typeof listItemIds !== "undefined") {
        countOfIDs = listItemIds.split(',').length;
    }

    loadDependentScripts();
}



function loadDependentScripts() {
    var scriptbase = hostweburl + "/_layouts/15/";

    // Load the js files and continue to the successHandler
    $.getScript(scriptbase + "SP.Runtime.js",
        function () {
            $.getScript(scriptbase + "SP.js",
                function () { $.getScript(scriptbase + "SP.RequestExecutor.js", specificListFromHostWebUsingREST); }
                );
        }
    );
}

function specificListFromHostWebUsingREST() {
    var executor;


    //If User does not select any option
    if (!listItemIds) {
        listItemIds = "1, 2, 3";
    }

    // although we're fetching data from the host web, SP.RequestExecutor gets initialized with the app web URL..
    executor = new SP.RequestExecutor(appweburl);
    executor.executeAsync(
        {
            url:
                appweburl +"/_api/SP.AppContextSite(@target)/web/lists/getbytitle('" + targetList + "')/items?@target='" +
                hostweburl + "'&$select=Title",
            method: "GET",
            headers: { "Accept": "application/json; odata=verbose" },
            success: Success,
            error: Fail
        }
    );
}

function Success(data) {
    var jsonObject = JSON.parse(data.body);

    if (typeof countOfIDs !== "undefined") {
        $('#selectedIDs').text(countOfIDs.toString());

    }


    for (var i = 0; i < jsonObject.d.results.length; i++) {
        //var currentObject = jsonObject[i]
        var result = jsonObject.d.results[i];
        $('#Status').append("<div style='padding-gt;" + result.Title + "</div>");


    }

    if (typeof countOfIDs !== "undefined") {
        $('#selectedIDs').text(countOfIDs.toString());

    }


}

function Fail(data, errorCode, errorMessage) {
    alert('Failed to get host site. Error:' + errorMessage);
}

function getQueryStringParameter(paramToRetrieve) {
    var params =
        document.URL.split("?")[1].split("&");
    for (var i = 0; i < params.length; i = i + 1) {
        var singleParam = params[i].split("=");
        if (singleParam[0] == paramToRetrieve)
            return singleParam[1];
  • Thank in advance.

Sandy


Viewing all articles
Browse latest Browse all 25064

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>