Log user and date upon row addition

/*
* Log user and date upon row addition
*
* The script checks who and when adds rows to the IJC table.
* Whenever a new row is added, username and time are stored in IJC fields.
* Attention: fields for username and date must be defined in the IJC table
* before running this script.
*
* Usage:
* 1. Add User and Date fields into the table
* 2. Edit the name of User and Date fields
* 3. Run button script
*
* @author Ondrej Svoboda <[email protected]>
*/
 
afterEdit= {event ->
//Names of fields where username and date is stored
def userFieldName="username"
def dateFieldName="textDate"
println "after edit operation"
def widget=event.widget
// find user and date fields
def userField=widget.boundFields.find{it.name==userFieldName}
def dateField=widget.boundFields.find{it.name==dateFieldName}
// get the username and date
def vs=widget.vertexState
// get entity from the widget vertex state
def ety=vs.getVertex().getEntity()
// get id of the row you are adding
selectedRowId=vs.getSelectedRowsIds()
// go to the schema
def rs=vs.resultSet
def dataTree=rs.dataTree
def schema=dataTree.schema
// get user
def user=DIFUtilities.findCapability(schema,IJCUserLoginService.class).getMe()
// get date
def today = new Date()
// get entity data provider
def edp = ety.schema.dataProvider.getEntityDataProvider(ety)
// get access to the environment through lock
def lock = edp.lockable.withLock('Updating'){ envRW ->
// control whether date and user fields are filled. If so, do not update them
def data=vs.getData(selectedRowId,DFEnvironmentRO.DEV_NULL)
println data[selectedRowId[0]][userField.id]
if((data[selectedRowId[0]][userField.id]==null) && (data[selectedRowId[0]][dateField.id]==null)) {
// Defines empty map
def vals = [:]
vals[userField.id] = user.getUsername()
// date field is defined as a string, the format can be arbitrary
vals[dateField.id] = today.format("yyyy-MM-dd \'at\' HH:mm:ss")
// Create the DFUpdateDescription and update the DFEntityDataProvider
def ud = DFUpdateDescription.create(ety, selectedRowId, vals)
def submitList = Collections.singletonList(ud)
edp.update(submitList, DFUndoConfig.OFF, envRW)
println "Updating field $userFieldName to value ${user.getUsername()} and field $dateFieldName to value $today"
}
}
// by returning false, the action proceeds as expected
return false
}