How to support Component field in Lookup Manager
Scenario
For the list of supported fields, refer to https://akeles.jira.com/wiki/spaces/LOOKUP/pages/1195606017
The Component field is not supported in the Source Field and Destination Field. We can solve this problem by using both the ScriptRunner and Lookup Manager together.
How-to
Step 1: Create a Lookup Table
Check out how to create a lookup table
Component | Custom_Select | Category |
---|---|---|
Internal | LOOKUP | INTERNAL |
Business | CQL | BUSINESS |
Client | OOO | CLIENT |
Step 2: Create Custom Script Post-Function(ScriptRunner)
Step 3: Copy and paste the code below into the console
Case 1: Component Field as Source Field
To populate a custom field based on looking up Component in a table managed by Lookup Manager
The Lookup Manager gets the Component Table to search the Component column for the value Internal. If there is a matching row, return the value in the Custom_Select column.
Then set the value to custom field Custom_Select on the created issue.
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.akelesconsulting.jira.plugins.rest.LookupService
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.project.Project
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueManager
import org.apache.log4j.Logger
import org.apache.log4j.Level
import groovy.json.JsonSlurper
@WithPlugin("com.akelesconsulting.jira.plugins.LookupManager")
@PluginModule
LookupService lookupService
def log = Logger.getLogger("LookupManager")
log.setLevel(Level.DEBUG)
def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
log.debug("***** Populate a custom field based on looking up Component in a table managed by Lookup Manager *****")
def components = issue.getComponentObjects();
log.debug ( issue.getComponentObjects()*.name ) //print out the name of each of the components
if (components) {
def tableName = "Component Table"
def sourceCol = "Component"
def sourceVal = components[0].name //E.g. "Internal"
def destCol = "Field_1"
int tableId = lookupService.getTableIdByName(tableName) //tableId = 1
def matchingValuesArray = lookupService.lookup(tableId, sourceCol, sourceVal, destCol) // matchingValuesArray = [LOOKUP]
def value = matchingValuesArray[0]
log.debug("Matching Vallue: " + value)
def customFieldName = "Custom_Select" //Custom Select Field
def cfSelect = customFieldManager.getCustomFieldObjectByName(customFieldName)
assert cfSelect: "Could not find custom field with name $customFieldName"
def availableOptions = ComponentAccessor.optionsManager.getOptions(cfSelect.getRelevantConfig(issue))
def optionToSet = availableOptions.find {it.value == value}
assert optionToSet: "Could not find option with value $newValue. Available options are ${availableOptions*.value.join(",")}"
issue.setCustomFieldValue(cfSelect, optionToSet)
issueManager.updateIssue(user, issue, EventDispatchOption.DO_NOT_DISPATCH, false)
}
Case 2: Component Field as Destination Field
To set the Component value based on looking up a custom field in a table managed by Lookup Manager
The Lookup Manager gets the Component Table to search the Category column for the value INTERNAL. If there is a matching row, return the value in the Component column.
Then set the value to Component field on the created issue.
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.akelesconsulting.jira.plugins.rest.LookupService
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.project.Project
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.component.ComponentAccessor
import org.apache.log4j.Logger
import org.apache.log4j.Level
import groovy.json.JsonSlurper
import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.bc.project.component.ProjectComponent
import com.atlassian.jira.event.type.EventDispatchOption
import com.atlassian.jira.util.collect.MapBuilder;
import java.util.List;
import org.ofbiz.core.entity.GenericValue;
import org.ofbiz.core.entity.GenericEntityException;
@WithPlugin("com.akelesconsulting.jira.plugins.LookupManager")
@PluginModule
LookupService lookupService
def log = Logger.getLogger("LookupManager")
log.setLevel(Level.DEBUG)
def issueManager = ComponentAccessor.getIssueManager()
def customFieldManager = ComponentAccessor.getCustomFieldManager()
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
log.debug("***** Set the Component value based on looking up another custom field in a table managed by Lookup Manager *****")
def customFieldName = "Category" //Custom Select Field
def cfSelect = customFieldManager.getCustomFieldObjectByName(customFieldName)
assert cfSelect: "Could not find custom field with name $customFieldName"
if (issue.getCustomFieldValue(cfSelect)) {
def tableName = "Component Table"
def sourceCol = "Category"
def sourceVal = issue.getCustomFieldValue(cfSelect).getValue() // INTERNAL
def destCol = "Component"
def tableId = lookupService.getTableIdByName(tableName) //tableId = 1
def matchingValuesArray = lookupService.lookup(tableId, sourceCol, sourceVal, destCol) // matchingValuesArray = [Internal]
def value = matchingValuesArray[0]
log.debug("Matching Vallue: " + value)
def project = issue.getProjectObject()
def projectComponentManager = ComponentAccessor.getProjectComponentManager()
def component = projectComponentManager.findByComponentName(project.getId(), value)
assert component: "Could not find component name $value"
issue.setComponent([component])
//Update Assignee field
def componentType = component.getAssigneeType()
def assignee = null
switch (componentType) { //0 = Project Default, 3 = Component Lead, 2 = Project Lead, 3 = Unassigned,
case 0:
def projectDefault = issue.getProjectObject().getAssigneeType() //2 = Project Lead, 3 = Unassigned
if (projectDefault == 2) {
assignee = issue.getProjectObject().getProjectLead()
}
break
case 1:
assignee = component.getComponentLead()
break
case 2:
assignee = issue.getProjectObject().getProjectLead()
break
case 3:
assignee = null
}
log.debug("Assignee: " + assignee)
issue.setAssignee(assignee)
issueManager.updateIssue(user, issue, EventDispatchOption.DO_NOT_DISPATCH, false)
}
Step 3: Put the post function after the “Create the issue originally”
The custom script runner post-function should be placed after the Create the issue originally transition.