I want to restrict a subtask's Project Specific Select Field custom field options based on other peer subtask's values in the same field. I'm not sure that PSSF custom field type matters here versus a standard select list, but wanted to mention it anyway.
The code below mostly works as expected. I can create a subtask and get all possible options (e.g. "A", "B", "C") for Target Release field. I choose "A" for this subtask. When I create a second subtask, I am presented with the full list of options minus the one I selected in the first subtask (i.e. "B", "C").
However, this is a required field. So normally the form would also present a "None" option as the selected value and thus force the user to make a choice here. But with the behaviour active, "None" gets removed. This basically makes a selection by default and also means other things don't trigger as they normally would on field change.
So I added the line to explicitly add "None" to the options list. Now, it shows TWO None options. So with my code to prune the choice list, I can either have no None value or two None values. How do I get the pruned list plus a single default None entry (that's not a valid choice)?
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.IssueManager
import com.onresolve.jira.groovy.user.FieldBehaviours
import com.onresolve.jira.groovy.user.FormField
import groovy.transform.BaseScript
@BaseScript FieldBehaviours fieldBehaviours
def targetReleaseId = 18100 // Target Release - Project Specific Select Field
FormField targetRelease = getFieldById("customfield_" + targetReleaseId)
def parent
def parentIssue
def issueManager
def subTasks
def summary
def targetReleaseValue
summary = getFieldById("summary")
String currentSummary = summary.getFormValue() as String
targetReleaseValue = targetRelease.getValue() as String
parent = getFieldById("parentIssueId")
Long parentIssueId = parent.getFormValue() as Long
log.warn("Summary: " + currentSummary)
log.warn("Target Release: " + targetReleaseValue)
log.warn("Parent Id: " + parentIssueId)
issueManager = ComponentAccessor.getIssueManager()
parentIssue = issueManager.getIssueObject(parentIssueId)
subTasks = parentIssue.getSubTaskObjects()
if (!parent) {
log.warn("Not a subtask; returning")
return
}
// remove any Target Release value options that exist in other TR subtasks
def existingTargetReleases = []
subTasks.each {
log.warn("Subtask: " + it)
// This is cheating a bit, but we'll deal with summary field instead of
// the Project Specific Select Field "Target Release" since I couldn't get that
// to work properly inside this subTasks each loop
if (it.getIssueType().name == "Target Release Sub-task") {
log.warn("TR summary: " + it.summary)
// add existing target release names to list
existingTargetReleases.push(it.summary)
}
}
// set options list to be all targets minus existing targets; but keep None
def optionsManager = ComponentAccessor.getOptionsManager()
def targetReleaseField = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(targetReleaseId)
def targetReleaseConfig = targetReleaseField.getRelevantConfig(getIssueContext())
def trOptions = optionsManager.getOptions(targetReleaseConfig)
def newTrOptions = [:]
newTrOptions.put("-1", "None") // want to keep the None option; BUG! but this gives two None options
newTrOptions += trOptions.findAll { !(it.value in existingTargetReleases) }.collectEntries {
[(it.optionId.toString()): it.value]
}
log.warn("All Target Release Options: " + trOptions)
log.warn("Existing Target Releases: " + existingTargetReleases)
log.warn("Allowable Target Releases: " + newTrOptions)
targetRelease.setFieldOptions(newTrOptions)
// Set summary to be the target release value
log.warn("Checking if setting summary value required")
if (issueContext.issueType.name == "Target Release Sub-task" && (!summary || targetReleaseValue != summary)) {
def newSummary = targetReleaseValue
summary = getFieldById("summary")
summary.setFormValue(newSummary)
log.warn("Summary now set to: " + summary.getFormValue())
log.warn("Set summary to be: " + newSummary)
} else {
log.warn("Did not set summary")
}
Hello, is there any update on this issue?
I see the same double "None" options issue in select list, when I add "None" option manually in ScriptRunner v. 8.33.
In my case select list is a TextField converted to SingleSelect in ScriptRunner Behaviours:
def customField = getFieldById("customfield_123");
customField
.convertToSingleSelect([css: "max-width: 500px; width: 500px; white-space: pre-wrap;"])
.setFieldOptions(["":"None", "option1":"Option 1"]);
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.