Below is some sample code to delete a workflow on the host web from your app web. This would be useful in the event you want your App to remove a workflow that you have deployed to the host web.

NOTE: you must include a reference to “/_layouts/15/SP.WorkflowServices.js”

   var deleteWorkflow = function(workflowName) {

    //Using the App Web as the client context
    clientContext = new SP.ClientContext.get_current();

    //Get the host web URL from the query string params
    //I have a function getHostWebUrl() - which is not included.
    //http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
    var hostWebUrl = getHostWebUrl();

    //Using the hostWebContext as an AppContextSite
    hostWebContext = new SP.AppContextSite(clientContext, hostWebUrl);

    //Get the Workflow Services Manager for the Host web, NOTE: you initialize it with the clientContext & the hostWebContext Web)
    var hostWebWorkflowServicesManager = new SP.WorkflowServices.WorkflowServicesManager.newObject(clientContext, hostWebContext.get_web());
    var hostWebWorkflowDeploymentService = hostWebWorkflowServicesManager.getWorkflowDeploymentService();
    var hostWebDefinitionsCollection = hostWebWorkflowDeploymentService.enumerateDefinitions(false);

    //load all the workflow definitions from the host web 
    clientContext.load(hostWebDefinitionsCollection);
    clientContext.executeQueryAsync(function() {

     //get the enumerator for all the workflow definitions
     var workflowDefinitions = hostWebDefinitionsCollection.getEnumerator();
     while (workflowDefinitions.moveNext()) {

      //set the current definition to a variable
      var workflowDefinition = workflowDefinitions.get_current();

      //uncomment to see all the workflows that it finds
      //console.log("Found Workflow : " + workflowDefinition.get_displayName());

      //looking for a match on the name of the workflow
      if (workflowDefinition.get_displayName() === workflowName) {
       //using the host web workflow deployment service to delete the workflow definition

       hostWebWorkflowDeploymentService.deleteDefinition(workflowDefinition.get_id());
       //this comment will just display what workflow WILL BE deleted 
       console.log("Deleted workflow : " + workflowName + ", " + workflowDefinition.get_id().toString());

       //if more than one workflow with the same name is found it will delete all of them
       //the delete will get queued up and executed by the .executeQueryAsync
       //if you don't want that then you have to break out of the while loop
      }
     }
     //this query will execute the delete action
     clientContext.executeQueryAsync(function() {
      //Successfully deleted   the workflow
     }, function(sender, args) {
      console.log("Unable to delete workflow : " + workflowName);
      console.log("Reason : " + args.get_message() + "");
     });
    }, function(sender, args) {
     console.log("Failed to load workflows");
     console.log("Reason : " + args.get_message() + "");
    });
   };
Comments
  • arash
    Posted at 5:29 pm June 26, 2014
    arash
    Reply
    Author

    Hi Thomas. Thank you so much for the WF javascript. It took me whole day and once I used yours it worked like a charm. The issue I had was i was calling executequery on the hostwebcontext instead and once I use app web context to call it it worked.

    Again Thanks for this nice article.

    Arash

    • Thomas Daly
      Posted at 6:03 pm June 26, 2014
      Thomas Daly
      Reply
      Author

      That’s why I posted it 🙂 I struggled for a day or so trying to figure out why I was getting access denied with the calls. The documentation on it is not 100% yet.

      Glad this helped!

  • Leave a Reply

    This site uses Akismet to reduce spam. Learn how your comment data is processed.