24 Jan 2016

Handling the Close Icon for Dialogs with Running Task Flows

We can run an ADF bounded task flow in a modal dialog using out-of-the-box ADF controller functionality. This feature is fully described in the documentation. So, let's say there is task-flow-definition which we want to run in a dialog from Main page:

In order to get it working we have to set up task flow call activity property Run As Dialog to true and the Display Type property to inline-popup. Besides that the caller command button should have the useWindow property set to true:

  <af:button text="Dialog" id="b1" useWindow="true"
             action="dlg"
             returnListener="#{pageFlowScope.TheBean.returnDialogListener}"/>

Whenever the task flow reaches its Return activity, the framework closes the dialog and invokes a return listener specified for the caller command button. In this way a caller is notified that the dialog is closed and it is able to handle the task flow return values. 

However, if the user closes the dialog using a standard close icon, the task flow is considered abandoned and the framework won't fire any event. So, the caller will never know about that. Obviously, there are some use-cases when the caller needs to get notified about such case. This requirement can be implemented using Chaperone technique. 

Let's define the following interface:

public interface DialogCancelListener {
  void dialogCanceled();
}

and implement it with our caller managed bean (TheBean):

  @Override
  public void dialogCanceled(){
     //Handle dialog cancel event
  }


There is an input parameter of the task flow:

<input-parameter-definition id="__6">
 <name>cancelListener</name>
 <value>#{pageFlowScope.FlowBean.cancelListener}</value>
 <class>com.adfpractice.taskflowdialogapp.view.DialogCancelListener</class>
</input-parameter-definition>

The value of this parameter is going to be an instance of our caller managed bean:


The task-flow-definition looks like this:

So, whenever the task flow is about to be finished in a normal way it is going to set up return values that will be handled by the caller in the return listener. If the user finishes the task flow by clicking on the close icon, the task flow is abandoned and setupReturnValues method will never be invoked. The task flow has a finalizer checking if the return values have been set up. If they have not been set up it invokes dialogCanceled method of the cancelListener.

  public void taskFlowFinalizer() {
    if (!returnValuesSetUp) {
      cancelListener.dialogCanceled(); 
    }
  }
In his way the caller managed bean (TheBean) is going to be notified about abandoning of the target task flow.

That's it!



No comments:

Post a Comment

Post Comment