Joget DX 8 Stable Released
The stable release for Joget DX 8 is now available, with a focus on UX and Governance.
...
Anchor | ||||
---|---|---|---|---|
|
element - Element that this binder is tie to. (org.joget.apps.form.model.Element)
primaryKey - The primary key provided by the element to load data. (java.lang.String)
formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
...
...
Code Block | ||
---|---|---|
| ||
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import org.joget.apps.app.service.AppUtil; import org.joget.apps.form.model.Element; import org.joget.apps.form.model.FormData; import org.joget.apps.form.model.FormRow; import org.joget.apps.form.model.FormRowSet; import org.joget.commons.util.LogUtil; public FormRowSet load(Element element, String username, FormData formData) { FormRowSet rows = new FormRowSet(); if (username != null && !username.isEmpty()) { Connection con = null; try { // retrieve connection from the default datasource DataSource ds = (DataSource)AppUtil.getApplicationContext().getBean("setupDataSource"); con = ds.getConnection(); // execute SQL query if(!con.isClosed()) { PreparedStatement stmt = con.prepareStatement("SELECT username, firstName, lastName, email from dir_user where username=?"); stmt.setObject(1, username); ResultSet rs = stmt.executeQuery(); while (rs.next()) { FormRow row = new FormRow(); System.out.println(rs.getObject("username") ); row.setProperty("username", (rs.getObject("username") != null)?rs.getObject("username").toString():""); row.setProperty("firstName", (rs.getObject("firstName") != null)?rs.getObject("firstName").toString():""); row.setProperty("lastName", (rs.getObject("lastName") != null)?rs.getObject("lastName").toString():""); row.setProperty("email", (rs.getObject("email") != null)?rs.getObject("email").toString():""); rows.add(row); break; } } } catch(Exception e) { LogUtil.error("Sample app - Form 1", e, "Error loading user data in load binder"); } finally { //always close the connection after used try { if(con != null) { con.close(); } } catch(SQLException e) {/* ignored */} } } return rows; } //call load method with injected variable return load(element, primaryKey, formData); |
...
...
...
...
...
...
...
Do some calculation before storing the data using Workflow Form Binder.
Code Block | ||
---|---|---|
| ||
|
...
import java.text.DecimalFormat; import org.joget.apps.app.service.AppUtil; import org.joget.apps.form.model.Element |
...
; import org.joget.apps.form.model.FormData |
...
Compare the submitted value with the value of another field.
Code Block | ||
---|---|---|
| ||
import java.util.Arrays; import org.joget.apps.appform.servicemodel.AppUtilFormRow; import org.joget.apps.form.model.ElementFormRowSet; import org.joget.apps.form.model.FormFormStoreBinder; import org.joget.appsplugin.formbase.model.FormDataPluginManager; import org.joget.apps.form.service.FormUtil; public booleanFormRowSet validatestore(Element element, FormDataFormRowSet formDatarows, String[]FormData valuesformData) { boolean result = true; //getcheck the fieldrows 1is valuenot fromempty formbefore datastore objectit Stringif field1Id(rows != "field1"; Form form = FormUtil.findRootForm(element);null && !rows.isEmpty()) { Element field1 = FormUtil.findElement(field1Id, form, formData); //Get the submitted data if (field1 != null) { FormRow row = rows.get(0); //get value of field 1 String[] compareValuesunitPrice = FormUtilrow.getElementPropertyValues(field1, formDatagetProperty("unitPrice"); //compare the value of field 2 and field 1 are equalsString unit = row.getProperty("unit"); if (!Arrays.equals(values, compareValues)) {double total = 0; try { String id = FormUtil.getElementParameterName(element); double price = formDataDouble.addFormError(id, "Value not equal!!!!"parseDouble(unitPrice); int resultunit = falseInteger.parseInt(unit); } } else { //ignore if thetotal field= 1price not* existunit; } return result; } //call validate method with injected variable return validate(element, formData, values); |
...
} catch (Exception e) {} //format the total to 2 decimal DecimalFormat df = new DecimalFormat("#.00"); row.setProperty("total", df.format(total)); //Reuse Workflow Form Binder to store data PluginManager pluginManager = (PluginManager) AppUtil.getApplicationContext().getBean("pluginManager"); FormStoreBinder binder = (FormStoreBinder) pluginManager.getPlugin("org.joget.apps.form. |
...
lib. |
...
WorkflowFormBinder");
binder.store(element, rows, formData);
}
return rows;
}
//call store method with injected variable
return store(element, rows, formData); |
Load default grid data from another table if current record does not have any grid data.
Code Block |
---|
|
...
Bulk create users based on the grid dataCompare the submitted value with the value of another field.
Code Block | ||
---|---|---|
| ||
import import java.util.HashSet; import java.util.SetArrays; import org.joget.apps.app.service.AppUtil; import org.joget.apps.form.model.Element; import org.joget.apps.form.model.FormDataForm; import org.joget.apps.form.model.FormRowFormData; import org.joget.apps.form.modelservice.FormRowSet; import org.joget.commons.util.LogUtil; import org.joget.commons.util.StringUtil; import org.joget.directory.model.Role; import org.joget.directory.model.User; import org.joget.directory.dao.RoleDao; import org.joget.directory.dao.UserDao; import org.joget.directory.model.service.DirectoryUtil; import org.joget.directory.model.service.UserSecurity; public FormRowSet store(Element element, FormRowSet rows, FormData formData) { try { UserSecurity us = DirectoryUtil.getUserSecurity(FormUtil; public boolean validate(Element element, FormData formData, String[] values) { boolean result = true; //get field 1 value from form data object String field1Id = "field1"; Form form = FormUtil.findRootForm(element); RoleDao roleDaoElement field1 = (RoleDao) AppUtil.getApplicationContext().getBean("roleDao"FormUtil.findElement(field1Id, form, formData); if UserDao userDao (field1 != (UserDaonull) AppUtil.getApplicationContext().getBean("userDao");{ //get value of field 1 for (FormRow row : rows) { String[] compareValues = FormUtil.getElementPropertyValues(field1, formData); //Getcompare the submittedvalue dataof forfield each2 gridand row field 1 are equals String username = row.getProperty("username");if (!Arrays.equals(values, compareValues)) { String firstNameid = rowFormUtil.getPropertygetElementParameterName("firstName"element); String lastName = row.getProperty("lastNameformData.addFormError(id, "Value not equal!!!!"); String emailresult = row.getProperty("email")false; } String password} = row.getProperty("password");else { //ignore if the field 1 not exist } return User user = new User(); user.setId(username); user.setUsername(username); user.setTimeZone("0"); user.setActive(1); user.setFirstName(firstName); user.setLastName(lastName); user.setEmail(email); //Check if there is user security implementation, using it to encrypt password if (us != null) { user.setPassword(us.encryptPassword(username, password)); } else { user.setPassword(StringUtil.md5Base16(password)); } user.setConfirmPassword(password); //set user role Set roleSet = new HashSet(); roleSet.add(roleDao.getRole("ROLE_USER")); user.setRoles(roleSet); userDao.addUser(user);result; } //call validate method with injected variable return validate(element, formData, values); |
Load default grid data from another table if current record does not have any grid data.
Code Block |
---|
import org.joget.apps.form.model.Element; import org.joget.apps.form.model.FormData; import org.joget.apps.form.model.FormRow; import org.joget.apps.form.model.FormRowSet; import org.joget.apps.form.service.FormUtil; import org.joget.plugin.base.PluginManager; import org.joget.apps.form.model.FormLoadBinder; public FormRowSet load(Element element, String primaryKey, FormData formData) { String defaultFormDefId = "default_grid_entry"; //change this to the form id used to store default grid data String formDefId = "grid_entry"; //change this to the form id used to store grid data String foreignKey = "fk"; //change this to the foreign key FormRowSet f = new FormRowSet(); f.setMultiRow(true); // Reuse Multi Row Binder to load data PluginManager pluginManager = (PluginManager) FormUtil.getApplicationContext().getBean("pluginManager"); FormLoadBinder binder = (FormLoadBinder) pluginManager.getPlugin("org.joget.plugin.enterprise.MultirowFormBinder"); //Load from the grid table binder.setProperty("formDefId", formDefId); binder.setProperty("foreignKey", foreignKey); f = binder.load(element, primaryKey, formData); //if no grid data is retrieved, get from default table if (f == null || f.isEmpty()) { binder.setProperty("formDefId", defaultFormDefId); if (us != null) { //set the foreign key value us.insertUserPostProcessing(user);to empty f = binder.load(element, }"", formData); } } catch (Exception e) { LogUtil.error("Sample app - Bulk Create Users form", e, "Store user error!!"); } return rows; } return f; } //call storeload method with injected variable return storeload(element, rowsprimaryKey, formData); |
...
...
Validate the sum of a column values are less than 1000.
Code Block |
---|
|
Check the current user's username are same with the form field "creator" value. The following sample using Form Hash Variable to retrieve form field value.
Bulk create users based on the grid data.
Code Block |
---|
import java.util.HashSet;
import java.util.Set;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.FormData |
Code Block |
import java.util.Map; import org.joget.apps.directoryform.model.UserFormRow; public boolean isAuthorized(User user, Map params) { //using hash variable to get "creator" field value and escapes it with java syntax, then compare with current username return "#form.crm_account.creator?java#".equals(user.getUsername()); } //call isAuthorized method with injected variable return isAuthorized(user, requestParams); |
Reuse Email tool to send separate email to each users.
Code Block |
---|
|
Randomly assign an user in a department to a workflow activity.
Code Block | ||
---|---|---|
| ||
import java.util.ArrayList; import java.util.Collection; import org.joget.apps.app.service.AppUtil; import org.joget.directory.model.User; import org.joget.directory.model.service.ExtDirectoryManager; import org.joget.workflow.model.WorkflowActivity; public Collection getAssignees(WorkflowActivity activity) { Collection assignees = new ArrayList(); ExtDirectoryManager directoryManager = (ExtDirectoryManager) pluginManager.getBean("directoryManagerimport org.joget.apps.form.model.FormRowSet; import org.joget.commons.util.LogUtil; import org.joget.commons.util.StringUtil; import org.joget.directory.model.Role; import org.joget.directory.model.User; import org.joget.directory.dao.RoleDao; import org.joget.directory.dao.UserDao; import org.joget.directory.model.service.DirectoryUtil; import org.joget.directory.model.service.UserSecurity; public FormRowSet store(Element element, FormRowSet rows, FormData formData) { try { UserSecurity us = DirectoryUtil.getUserSecurity(); RoleDao roleDao = (RoleDao) AppUtil.getApplicationContext().getBean("roleDao"); UserDao userDao = (UserDao) AppUtil.getApplicationContext().getBean("userDao"); for (FormRow row : rows) { //Get the submitted data for each grid row String username = row.getProperty("username"); String firstName = row.getProperty("firstName"); String lastName = row.getProperty("lastName"); String email = row.getProperty("email"); String password = row.getProperty("password"); User user = new User(); user.setId(username); user.setUsername(username); user.setTimeZone("0"); String deptId = "D-005" user.setActive(1); //Get total user in department user.setFirstName(firstName); Long total = directoryManager.getTotalUsers(null, null, deptId, null, null, null, null user.setLastName(lastName); //Get random number from 0 to the total number of users in departmentuser.setEmail(email); int random = (int) (Math.random() * total); //GetCheck usersif usingthere directoryis manager user security implementation, using Collectionit userListto = directoryManager.getUsers(null, null, deptId, null, null, null, null, "firstName", false, random, 1); for(Object u : userList)encrypt password if (us != null) { User user = (User) u; assignees.add(user.getUsername(user.setPassword(us.encryptPassword(username, password)); } else { return assignees; } //call getAssignees method with injected variable return getAssignees(workflowActivity); |
Start a new process in the same app with current record id.
Code Block | ||
---|---|---|
| ||
|
Check the user is in a group and is an admin user.
Code Block | ||
---|---|---|
| ||
|
...
user.setPassword(StringUtil.md5Base16(password));
}
user.setConfirmPassword(password);
//set user role
Set roleSet = new HashSet();
roleSet.add(roleDao.getRole("ROLE_USER"));
user.setRoles(roleSet);
userDao.addUser(user);
if (us != null) {
us.insertUserPostProcessing(user);
}
}
} catch (Exception e) {
LogUtil.error("Sample app - Bulk Create Users form", e, "Store user error!!");
}
return rows;
}
//call store method with injected variable
return store(element, rows, formData); |
Validate the sum of a column values are less than 1000.
Code Block |
---|
import java.util.Arrays;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.Form;
import org.joget.apps.form.model.FormData;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.apps.form.service.FormUtil;
public boolean validate(Element element, FormRowSet rows, FormData formData) {
boolean result = true;
if (rows != null && !rows.isEmpty()) {
int total = 0;
//Sum the values from column "amount"
for (FormRow row : rows) {
try {
int amount = Integer.parseInt(row.getProperty("amount"));
total += amount;
} catch (Exception e) {}
}
//if amount larger than 1000
if (total > 1000) {
String id = FormUtil.getElementParameterName(element);
formData.addFormError(id, "Total amount should not larger than 1000!!!!");
result = false;
}
}
return result;
}
//call validate method with injected variable
return validate(element, rows, formData); |
Check the current user's username are same with the form field "creator" value. The following sample using Form Hash Variable to retrieve form field value.
Code Block |
---|
import java.util.Map;
import org.joget.directory.model.User;
public boolean isAuthorized(User user, Map params) {
//using hash variable to get "creator" field value and escapes it with java syntax, then compare with current username
return "#form.crm_account.creator?java#".equals(user.getUsername());
}
//call isAuthorized method with injected variable
return isAuthorized(user, requestParams); |
Reuse Email tool to send separate email to each users. The following script is for a form not mapped to workflow assignment, therefore workflowAssignment is not available.
Code Block |
---|
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.joget.apps.app.model.AppDefinition;
import org.joget.apps.app.service.AppPluginUtil;
import org.joget.apps.app.service.AppUtil;
import org.joget.plugin.base.ApplicationPlugin;
import org.joget.plugin.base.Plugin;
import org.joget.plugin.base.PluginManager;
import org.joget.plugin.property.model.PropertyEditable;
public Object execute(AppDefinition appDef, HttpServletRequest request) {
String[] emails = new String[]{"test1@joget.org", "test2@joget.org"};
//Reuse Email Tool to send separated email to a list of users;
Plugin plugin = pluginManager.getPlugin("org.joget.apps.app.lib.EmailTool");
//Get default properties (SMTP setting) for email tool
Map propertiesMap = AppPluginUtil.getDefaultProperties(plugin, null, appDef, null);
propertiesMap.put("pluginManager", pluginManager);
propertiesMap.put("appDef", appDef);
propertiesMap.put("request", request);
ApplicationPlugin emailTool = (ApplicationPlugin) plugin;
//send email
for (String email : emails) {
propertiesMap.put("toSpecific", email);
propertiesMap.put("subject", "This is a test email for " + email);
propertiesMap.put("message", "Email content for " + email);
//set properties and execute the tool
((PropertyEditable) emailTool).setProperties(propertiesMap);
emailTool.execute(propertiesMap);
}
return null;
}
//call execute method with injected variable
return execute(appDef, request); |
Randomly assign an user in a department to a workflow activity.
Code Block | ||
---|---|---|
| ||
import java.util.ArrayList;
import java.util.Collection;
import org.joget.apps.app.service.AppUtil;
import org.joget.directory.model.User;
import org.joget.directory.model.service.ExtDirectoryManager;
import org.joget.workflow.model.WorkflowActivity;
public Collection getAssignees(WorkflowActivity activity) {
Collection assignees = new ArrayList();
ExtDirectoryManager directoryManager = (ExtDirectoryManager) pluginManager.getBean("directoryManager");
String deptId = "D-005";
//Get total user in department
Long total = directoryManager.getTotalUsers(null, null, deptId, null, null, null, null);
//Get random number from 0 to the total number of users in department
int random = (int) (Math.random() * total);
//Get users using directory manager
Collection userList = directoryManager.getUsers(null, null, deptId, null, null, null, null, "firstName", false, random, 1);
for(Object u : userList){
User user = (User) u;
assignees.add(user.getUsername());
}
return assignees;
}
//call getAssignees method with injected variable
return getAssignees(workflowActivity); |
Anchor | ||||
---|---|---|---|---|
|
Start a new process in the same app with current record id.
Code Block | ||
---|---|---|
| ||
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.joget.apps.app.model.AppDefinition;
import org.joget.apps.app.service.AppService;
import org.joget.apps.app.service.AppUtil;
import org.joget.workflow.model.service.WorkflowManager;
import org.joget.workflow.model.WorkflowAssignment;
import org.joget.workflow.model.WorkflowProcess;
public Object execute(WorkflowAssignment assignment, AppDefinition appDef, HttpServletRequest request) {
AppService appService = (AppService) AppUtil.getApplicationContext().getBean("appService");
WorkflowManager workflowManager = (WorkflowManager) AppUtil.getApplicationContext().getBean("workflowManager");
//get current record id
String recordId = appService.getOriginProcessId(assignment.getProcessId());
//get process
WorkflowProcess process = appService.getWorkflowProcessForApp(appDef.getAppId(), appDef.getVersion().toString(), "process2");
//start process
workflowManager.processStart(process.getId(), null, null, null, recordId, false);
return null;
}
//call execute method with injected variable
return execute(workflowAssignment, appDef, request); |
Check the user is in a group and is an admin user.
Code Block | ||
---|---|---|
| ||
import java.util.Collection;
import java.util.Map;
import org.joget.apps.app.service.AppUtil;
import org.joget.directory.model.Group;
import org.joget.directory.model.User;
import org.joget.directory.model.service.ExtDirectoryManager;
import org.joget.workflow.model.service.WorkflowUserManager;
import org.joget.workflow.util.WorkflowUtil;
public boolean isAuthorized(User user, Map params) {
//if no logged in user
if (user == null) {
return false;
}
//check current user is admin
boolean isAdmin = WorkflowUtil.isCurrentUserInRole(WorkflowUserManager.ROLE_ADMIN);
//check current user is in group "G-001"
boolean inGroup = false;
ExtDirectoryManager directoryManager = (ExtDirectoryManager) AppUtil.getApplicationContext().getBean("directoryManager");
Collection groups = directoryManager.getGroupByUsername(user.getUsername());
if (groups != null) {
String groupId = "G-001";
for (Group g : groups) {
if (groupId.equals(g.getId())) {
inGroup = true;
}
}
}
return isAdmin && inGroup;
}
//call isAuthorized method with injected variable
return isAuthorized(user, requestParams); |
...
If your script need to reuse for multiple times in an app or can be used by others app in future development, please consider to make your Bean Shell script as a plugin instead of copy and paste it multiple times across your app. Bean Shell script is harder to maintain in this case. Imagine that you want to make a change, you will have to update all the places that are using the same script as well. Beside that, a normal plugin implementation will have better performance than a script running by a Bean Shell interpreter.
If partial of your script can be done by existing plugins in Joget Workflow, you can reuse the plugin in stead of writting it again.
To reuse a plugin, you can retrieve the plugin using PluginManager, then set it properties and execute it.
Example:
Children Display |
---|