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); |
...
...
...
...
...
...
...
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;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.apps.form.model.FormStoreBinder;
import org.joget.plugin.base.PluginManager;
public FormRowSet store(Element element, FormRowSet rows, FormData formData) {
//check the rows is not empty before store it
if (rows != null && !rows.isEmpty()) {
//Get the submitted data
FormRow row = rows.get(0);
String unitPrice = row.getProperty("unitPrice");
String unit = row.getProperty("unit");
double total = 0;
try {
double price = Double.parseDouble(unitPrice);
int unit = Integer.parseInt(unit);
total = price * unit;
} 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); |
...
...
...
...
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); //set the foreign key value to empty f = binder.load(element, "", formData); } return f; } //call load method with injected variable return load(element, primaryKey, formData); |
...
...
Bulk create users based on the grid data.
Code Block |
---|
importimport 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; import org.joget.apps.form.model.FormRow; import 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"); 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); 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. |
...
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.Mapservice.AppUtil; import org.joget.apps.form.model.Element; import org.joget.apps.form.model.Form; import org.joget.apps.directoryform.model.User; FormData; import org.joget.apps.form.model.FormRow; import org.joget.apps.form.model.FormRowSet; import org.joget.apps.form.service.FormUtil; public boolean isAuthorized(User user, Map paramsvalidate(Element element, FormRowSet rows, FormData formData) { //usingboolean hashresult variable= totrue; get "creator" field valueif and(rows escapes!= itnull 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.
&& !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) { | ||
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); //Getusing random number from 0hash variable to theget total"creator" numberfield ofvalue usersand inescapes department it with java syntax, intthen randomcompare =with (int) (Math.random() * total);current username //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); |
return "#form.crm_account.creator?java#".equals(user.getUsername());
}
//call isAuthorized method with injected variable
return isAuthorized(user, requestParams); |
Start a new process in the same app with current record idReuse 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 | ||
---|---|---|
| ||
|
Check the user is in a group and is an admin user.
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 |
---|