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. |
...
Compare the submitted value with the value of another field.
Code Block | ||
---|---|---|
| ||
import java.util.ArraysElement; import org.joget.apps.appform.servicemodel.AppUtilFormData; import org.joget.apps.form.model.ElementFormRow; import org.joget.apps.form.model.FormFormRowSet; import org.joget.apps.form.model.FormDataFormStoreBinder; import org.joget.appsplugin.formbase.service.FormUtilPluginManager; 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"); //compareString theunit value of field 2 and field 1 are equals = row.getProperty("unit"); double total = 0; if (!Arrays.equals(values, compareValues)) try { Stringdouble idprice = FormUtilDouble.getElementParameterNameparseDouble(elementunitPrice); formData.addFormError(id, "Value not equal!!!!"int unit = Integer.parseInt(unit); result = false; } total = }price else* {unit; //ignore} if the field 1 not exist catch (Exception e) {} } return result; } //callformat validatethe methodtotal withto injected2 variable return validate(element, formData, values); |
...
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 |
---|
|
...
Code Block |
---|
|
...
Compare the submitted value with the value of another field.
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. |
...
service.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);
Element field1 = FormUtil.findElement(field1Id, form, formData);
if (field1 != null) {
//get value of field 1
String[] compareValues = FormUtil.getElementPropertyValues(field1, formData);
//compare the value of field 2 and field 1 are equals
if (!Arrays.equals(values, compareValues)) {
String id = FormUtil.getElementParameterName(element);
formData.addFormError(id, "Value not equal!!!!");
result = false;
}
} else {
//ignore if the field 1 not exist
}
return 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 |
...
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.
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); |
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.appform.servicemodel.AppUtilFormData; import org.joget.directoryapps.form.model.UserFormRow; import org.joget.apps.directoryform.model.FormRowSet; import org.joget.apps.form.service.ExtDirectoryManager.FormUtil; import org.joget.plugin.base.PluginManager; import org.joget.apps.workflowform.model.WorkflowActivityFormLoadBinder; public CollectionFormRowSet getAssignees(WorkflowActivity activityload(Element element, String primaryKey, FormData formData) { CollectionString assigneesdefaultFormDefId = new ArrayList(); ExtDirectoryManager directoryManager = (ExtDirectoryManager) pluginManager.getBean("directoryManager"); "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 deptIdforeignKey = "D-005fk"; //change this to the foreign key //Get total user in department LongFormRowSet totalf = new directoryManager.getTotalUsers(null, null, deptId, null, null, null, null); FormRowSet(); f.setMultiRow(true); //Get randomReuse numberMulti fromRow 0Binder to the total number of users in departmentload data intPluginManager randompluginManager = (intPluginManager) FormUtil.getApplicationContext(Math).random() * totalgetBean("pluginManager"); FormLoadBinder binder = //Get users using directory manager Collection userList = directoryManager.getUsers(null, null, deptId, null, null, null, null, "firstName", false, random, 1(FormLoadBinder) pluginManager.getPlugin("org.joget.plugin.enterprise.MultirowFormBinder"); //Load from the grid table binder.setProperty("formDefId", formDefId); for(Object u : userList){binder.setProperty("foreignKey", foreignKey); f = binder.load(element, User user = (User) u; primaryKey, formData); //if no grid data is retrieved, get from default table if assignees.add(user.getUsername(f == null || f.isEmpty()); { } binder.setProperty("formDefId", defaultFormDefId); return assignees; } //call getAssignees method with injected variable return getAssignees(workflowActivity); |
...
//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); |
Code Block | ||
---|---|---|
| ||
|
Code Block | ||
---|---|---|
| ||
|
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;
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.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); |
...
Code Block | ||
---|---|---|
| ||
try {
//do something
} catch (Exception e) {
LogUtil.error("CRM app - Backend userview", e, "Error retrieving user department in Report category permission");
} |
{
//do something
} catch (Exception e) {
LogUtil.error("CRM app - Backend userview", e, "Error retrieving user department in Report category permission");
} |
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:
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.
Children Display |
---|