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 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); |
...
...
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 |
---|
importimport 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); |
...
...
Reuse Email tool to send separate email to each users.
Code Block |
---|
|
Randomly assign an user in a department to a workflow activity.
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 | ||
Code Block | ||
| ||
import java.util.ArrayList; import java.util.Collection; import org.joget.appsplugin.appbase.service.AppUtilApplicationPlugin; import org.joget.directoryplugin.modelbase.UserPlugin; import org.joget.directoryplugin.modelbase.service.ExtDirectoryManagerPluginManager; import org.joget.plugin.workflowproperty.model.WorkflowActivityPropertyEditable; public CollectionObject getAssignees(WorkflowActivity activityexecute(AppDefinition appDef, HttpServletRequest request) { CollectionString[] assigneesemails = new ArrayList() String[]{"test1@joget.org", "test2@joget.org"}; ExtDirectoryManager//Reuse directoryManagerEmail =Tool (ExtDirectoryManager) pluginManager.getBean("directoryManager"); to send separated email to a list of users; StringPlugin deptIdplugin = "D-005"pluginManager.getPlugin("org.joget.apps.app.lib.EmailTool"); //Get total user in department default properties (SMTP setting) for email tool LongMap totalpropertiesMap = directoryManagerAppPluginUtil.getTotalUsersgetDefaultProperties(nullplugin, null, deptId, null, null, nullappDef, null); propertiesMap.put("pluginManager", pluginManager); //Get random number from 0 to the total number of users in departmentpropertiesMap.put("appDef", appDef); propertiesMap.put("request", request); intApplicationPlugin randomemailTool = (intApplicationPlugin) (Math.random() * total)plugin; //Getsend usersemail using directory manager for (String email Collection: userListemails) = directoryManager.getUsers(null, null, deptId, null, null, null, null, "firstName", false, random, 1{ propertiesMap.put("toSpecific", email); for(Object u : userList){ User user = (User) u propertiesMap.put("subject", "This is a test email for " + email); assigneespropertiesMap.add(user.getUsername()put("message", "Email content for " + email); } return assignees; } //callset getAssigneesproperties methodand withexecute injected the tool ((PropertyEditable) emailTool).setProperties(propertiesMap); emailTool.execute(propertiesMap); } return null; } //call execute method with injected variable return getAssignees(workflowActivityexecute(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); |
Check the user is in a group and is an admin user.
Code Block | ||
---|---|---|
| ||
|
...
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 |
---|