Skip to Content

In this concluding section of Part1, let us know how-to update the user interface to show the task data and workflow context.

The whole objective here is to use task APIs to (a) get task related data and enhance the workflow context (b) add task action button implementation and (c) bind the UI elements with the workflow context data.

So, when you want to use your custom UI application as a user task-interface of workflow then these steps need to be performed to ensure that workflow context and task context is seamlessly connected.

Each step mentioned below is not mandatory, you can choose to use them at your discretion and based on your requirement. But in most of the cases, for our internal showcase scenario, I have more or less followed the same steps and the integration of user interfaces works like butter.

Get started now:

  1. Open the Web IDE
  2. Open Component.js file of your project
  3. Add the following code snippets in init function to:
    • Get the task instance data
      // Step 1: get task data
      var startupParameters = this.getComponentData().startupParameters;
      var taskModel = startupParameters.taskModel;
      var taskData = taskModel.getData();
      var taskId = taskData.InstanceID;
      ​

    • Get the workflow context and enhance it with the task data
      var processContext = new sap.ui.model.json.JSONModel();
      
      $.ajax({
      url: "/bpmworkflowruntime/rest/v1/task-instances/" + taskId + "/context",
      method: "GET",
      contentType: "application/json",
      dataType: "json",
      success: function(result, xhr, data) {
      //Get the process context
      processContext.context = data.responseJSON;
      
      //Get task related data to be set in ObjectHeader
      processContext.context.task = {};
      processContext.context.task.Title = taskData.TaskTitle;
      processContext.context.task.Priority = taskData.Priority;
      processContext.context.task.Status = taskData.Status;
      
      if (taskData.Priority === "HIGH") {
      processContext.context.task.PriorityState = "Warning";
      } else if (taskData.Priority === "VERY HIGH") {
      processContext.context.task.PriorityState = "Error";
      } else {
      processContext.context.task.PriorityState = "Success";
      }
      
      processContext.context.task.CreatedOn = taskData.CreatedOn.toDateString();
      }
      });
      ​
    • Get the task description and add it to UI model
      //get task description and add it to the UI model
      var jsonModel = new sap.ui.model.json.JSONModel();
      startupParameters.inboxAPI.getDescription("NA", taskData.InstanceID).done(function(dataDescr) {
      processContext.context.task.Description = dataDescr.Description;
      jsonModel.setProperty("/context/task/Description", dataDescr.Description);
      }).
      fail(function(errorText) {
      jQuery.sap.require("sap.m.MessageBox");
      sap.m.MessageBox.error(errorText, {
      title: "Error"
      });
      });
      
      jsonModel.setData(processContext);
      this.setModel(jsonModel);
      ​
    • Next, add buttons and their implementation in the task interface.
      Here in this example, I have just added one button, you can choose to create other buttons based on your project requirement like button to Reject or Confirm etc.

      //Implementation for the approve button action
      var oPositiveAction = {
      sBtnTxt: "Approve",
      onBtnPressed: function(e) {
      var model = that.getModel();
      model.refresh(true);
      //Call a local method to perform further action
      that._triggerComplete(that.oComponentData.inboxHandle.attachmentHandle.detailModel.getData().InstanceID, true,
      jQuery.proxy(
      //on successful competion, call a local method to refresh the task list in My Inbox
      that._refreshTask, that));
      }
      };
      
      //Add 'Approve’ action to the task
      startupParameters.inboxAPI.addAction({
      action: oPositiveAction.sBtnTxt,
      label: oPositiveAction.sBtnTxt,
      type: "Accept"
      //Set the onClick function
      }, oPositiveAction.onBtnPressed);
      

      — All the above code snippet is added to the init function of the Component.js file —-

  4. Now, add few more functions in the Component.js file to:
    • Trigger action to complete the task.You need to implement this function for the button, whose click would complete the task. In this, you call task API to set the status as completed.You can find more details on the API here:
      https://help.sap.com/doc/40db36d987084ab09e496381090e9a2e/Cloud/en-US/wfs-core-api-docu.html

      //This method is called when the confirm button is click by the end user
      _triggerComplete: function(taskId, approvalStatus, refreshTask) {
      $.ajax({
      //Call workflow API to get the xsrf token
      url: "/bpmworkflowruntime/rest/v1/xsrf-token",
      method: "GET",
      headers: {
      "X-CSRF-Token": "Fetch"
      },
      success: function(result, xhr, data) {
      //After retrieving the xsrf token successfully
      var token = data.getResponseHeader("X-CSRF-Token");
      var dataText;
      //form the context that will be updated - approval status and the equipment list
      dataText = "{ \"status\":\"COMPLETED\",\"context\": {\"workplaceConfirmed\": \"" + approvalStatus + "\" }}";
      
      $.ajax({
      //Call workflow API to complete the task
      url:"/bpmworkflowruntime/rest/v1/task-instances/"+taskId,
      method: "PATCH",
      contentType: "application/json",
      //pass the updated context to the API
      data: dataText,
      headers: {
      //pass the xsrf token retrieved earlier
      "X-CSRF-Token": token
      },
      //refreshTask needs to be called on successful completion
      success: refreshTask
      });
      }
      });
      },
      
      
    • Finally, write a function to refresh the inbox once the task is completed
      //Request Inbox to refresh the control once the task is completed
      _refreshTask: function() {
      var taskId = this.getComponentData().startupParameters.taskModel.getData().InstanceID;
      this.getComponentData().startupParameters.inboxAPI.updateTask("NA", taskId);
      }
      ​

       

This completes the updates to Component.js file. Now let us modify the view.xml file to bind the UI element of the user interface such that they fetch the respective value from the workflow context

 

  1. Open the view.xml and change the Text field of FirstName label element to {/context/user/FirstName} where {/context} reads the data from the workflow context and remaining path is the relative payload path as passed to the workflow.Similarly do the same for other elements as shown below.

 

  1. Save and Deploy the SAPUI5 application
  2. Start a new workflow instance with the following payload and open the task in My Inbox
    {
    "user":{
    "FirstName":"Kate",
    "LastName":"Beckett",
    "city":"London",
    "country":"United Kingdom"
         }
    }
    ​

 

Now you will see the data in the form data from the workflow context

 

With this we complete Part1 of our learning. In this part you learnt how to create an HTML5 application and modify the application artefacts so that it can be successfully integrated in user task of SAP Cloud Platform Workflow. You also learnt about task APIs and how they can be used to associate task data with workflow context, so that the text in the UI element are shown appropriately when the task in opened in MyInbox application.

In the upcoming Part 2 and Part 3 you will learn some advanced options which might help you while using your custom UI5 application as user-task or to start the workflow.

Previous Blogs
Understanding Custom UI Integration with SAP Cloud Platform Workflow
Part1A: Build your Custom HTML5 application in SAP WebIDE for Workflow
Part1B: Using your Custom HTML5 application as User Task in Workflow

 

To report this post you need to login first.

7 Comments

You must be Logged on to comment or reply to a post.

  1. Johannes Bacher

    Hello Archana, thank you for this blog !

    Why is there not a workflow template project available with your coding for a simple approve/decline task and maybe some other types of tasks ? My expectation from CP workflow services was to work more in a “modelling” environment, and not do so much coding in javascript. Will this come, or do i misunderstand the concept ?

    And is there a blog (which i may have not found yet) which explains how to initiate a CP workflow from an ABAP backend system ? This would be the use case I am looking for.

    thank you,

    Johannes

    (0) 
    1. Archana Shukla Post author

      Hello Johannes,

      We would soon be coming up with the task-user-interface template, which means that application developer can create an user interface from the workflow user task, that will have predefined structure. In this blog, my intention and target audience was application UI developer who want to integrate their interface as workflow task UI.  The code is actually very small chunk that shows how to use Task APIs.

      If you want to initiate workflow from ABAP backend – which I presume is a on-premise system then you have to use combination of Cloud Connector and Workflow Runtime APIs. Workflow is exposed as REST-based service in SAP Cloud Platform and you can call this service like any other rest-based-service from the backend. I have a blog on how to invoke workflow service from SAP Cloud Integration service, which might also be helpful for you.

      Hope that helps,
      Archana

      (0) 
  2. Michael Paonam

    Hi Archana,

     

    Is there a way to debug the UI Application ? When I give the binding {/context/user/FirstName}, the user name isn’t showing up in the “My Inbox” task UI.

     

    Regards,

    Michael Paonam

    (0) 
    1. Archana Shukla Post author

      You can debug the javascript file like Component.js or Controller.js by opening the Developer’s Tool of the browser and you can use combination of Console and other views of the tool to find the cause of the problems with the view.

      (0) 
  3. Michael Paonam

    Hi Archana,

     

    In step 2, you wrote “Open Controller.js file of your project” and in step 4 also. Shouldn’t it be Component.js instead of Controller.js ?

    (0) 

Leave a Reply