Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Plugin Properties Options allowed us to provide an UI for user to configure a plugin. This tutorial is to demonstrate how we can make use of Element (Plugin) Select property type "elementselect" to achieve a dynamic and dependency configuration page.

In this tutorial, I will create a sample process tool which will print out all the values of the dependency fields in that plugin. Please download the source code and sample plugin KB:here.

As usual, we need a JSON file for plugin properties options in our plugin. My sample plugin only has 1 "elementselect" field named "option" and the url pointed to its own web service implementation to retrieve dependency properties options.

Code Block
File : /properties/app/pluginOptions.json
[
    {
        title : 'Edit Dependency Plugin Options Sample Tool',
        properties : [
            {
                name:'option',
                label:'Option',
                type : 'elementselect',
                options : [
                    {value : '', label : ''},
                    {value : 'option1', label : 'Option 1'},
                    {value : 'option2', label : 'Option 2'}
                ],
                required : 'true',
                url : '[CONTEXT_PATH]/web/json/app[APP_PATH]/plugin/org.joget.sample.DependencyPluginOptions/service?action=getJson',
            }
        ]
    }
]

And then, create another 2 JSON files for properties options which dependent on value "option1" and "option2" as below:

Code Block
File : /properties/app/pluginOptions_option1.json
[
    {
        title : 'Option 1',
        properties : [
            {
                name:'field1',
                label:'field 1',
                type : 'textfield'
            },
            {
                name:'field2',
                label:'field 2',
                type : 'textfield'
            },
            {
                name:'field3',
                label:'field 3',
                type : 'textfield'
            }
        ]
    }
]
Code Block
File : /properties/app/pluginOptions_option2.json
[
    {
        title : 'Option 2',
        properties : [
            {
                name:'field4',
                label:'field 4',
                type : 'textfield'
            },
            {
                name:'field5',
                label:'field 5',
                type : 'textfield'
            },
            {
                name:'field6',
                label:'field 6',
                type : 'textfield'
            }
        ]
    }
]

Once we done the properties options JSON definition files, we need to implement the PluginWebSupport interface to return the dependency properties options based on the selected value. 

Code Block
public void webService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     boolean isAdmin = WorkflowUtil.isCurrentUserInRole(WorkflowUserManager.ROLE_ADMIN);
     if (!isAdmin) {
         response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
         return;
     }

     String action = request.getParameter("action");
     if ("getJson".equals(action)) {
         String value = request.getParameter("value");

         String output = "";
         if (value != null && !value.isEmpty()) {
             output = AppUtil.readPluginResource(getClass().getName(), "/properties/app/pluginOptions_"+value+".json", null, true, null);
         }
         response.getWriter().write(output);
     } else {
         response.setStatus(HttpServletResponse.SC_NO_CONTENT);
     }
}

In my sample Process Tool plugin execute method, retrieve and print out the dependency options value.  

Code Block
public Object execute(Map properties) {
    //To retrieve the values of dependecy options object
    Object optionObj = properties.get("option");
    if (optionObj instanceof Map) {
        Map temp = (Map) optionObj;

        // to get the value of option
        String option = temp.get("className").toString();
        System.out.println("Option : " + option);

        // to get the value of dependecy fields
        Map optionProp = (Map) temp.get("properties");
        for (String key : (Set<String>) optionProp.keySet()) {
            System.out.println(key + " : " + optionProp.get(key));
        }
    }

    return null;
}

Below are some screenshots of the sample plugin.
Plugin properties configuration screen when Option is empty.

When Option 1 is selected, a new properties page is shown.

Dependency properties options based on Option 1.

Dependency properties options based on Option 2.

Plugin output when Option 1 is selected.

Plugin output when Option 2 is selected.